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.time.roles.web; 017 018 import java.sql.Date; 019 import java.util.*; 020 021 import com.gargoylesoftware.htmlunit.BrowserVersion; 022 import com.gargoylesoftware.htmlunit.WebClient; 023 import org.apache.log4j.Logger; 024 import org.joda.time.DateTime; 025 import org.json.simple.JSONArray; 026 import org.json.simple.JSONObject; 027 import org.json.simple.JSONValue; 028 import org.junit.Assert; 029 import org.junit.Test; 030 import org.kuali.hr.time.assignment.Assignment; 031 import org.kuali.hr.time.calendar.CalendarEntries; 032 import org.kuali.hr.time.detail.web.TimeDetailActionFormBase; 033 import org.kuali.hr.time.earncode.EarnCode; 034 import org.kuali.hr.time.service.base.TkServiceLocator; 035 import org.kuali.hr.time.test.HtmlUnitUtil; 036 import org.kuali.hr.time.timesheet.TimesheetDocument; 037 import org.kuali.hr.time.timesheet.web.TimesheetWebTestBase; 038 import org.kuali.hr.time.util.TKUtils; 039 import org.kuali.hr.time.util.TimeDetailTestUtils; 040 import org.kuali.hr.time.util.TkConstants; 041 042 import com.gargoylesoftware.htmlunit.html.HtmlForm; 043 import com.gargoylesoftware.htmlunit.html.HtmlPage; 044 045 /** 046 * See: https://wiki.kuali.org/display/KPME/Role+Security+Grid 047 */ 048 public class RoleTimesheetWebIntegrationTest extends TimesheetWebTestBase { 049 050 private static final Logger LOG = Logger.getLogger(RoleTimesheetWebIntegrationTest.class); 051 052 // Non Time Entry users (for this test) who have some access to 'fred's' 053 // Time Sheet. 054 private List<String> VALID_NON_ENTRY_USERS = new ArrayList<String>() {{ 055 /*add("testuser6");*/ add("frank"); add("fran"); add("edna"); }}; 056 057 // Users with incorrect Department or Work Area for Time Sheet privilege. 058 private List<String> INVALID_NON_ENTRY_USERS = new ArrayList<String>(){{ 059 add("testuser1"); add("testuser2"); add("testuser3"); add("testuser4"); }}; 060 061 private TimesheetDocument fredsDocument = null; 062 Date asOfDate = new Date((new DateTime(2011, 3, 1, 12, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis()); 063 064 @Override 065 /** 066 * This code is called before each test below - allows us to control how far 067 * into the routing process we are for any given level of testing. 068 */ 069 public void setUp() throws Exception { 070 super.setUp(); 071 072 String userId = "fred"; 073 074 CalendarEntries pcd = TkServiceLocator.getCalendarService().getCurrentCalendarDates(userId, asOfDate); 075 Assert.assertNotNull("No PayCalendarDates", pcd); 076 fredsDocument = TkServiceLocator.getTimesheetService().openTimesheetDocument(userId, pcd); 077 String tdocId = fredsDocument.getDocumentId(); 078 079 // Verify the non time entry logins. 080 verifyLogins(fredsDocument); 081 082 // Verify Fred, and Add Timeblocks 083 HtmlPage page = loginAndGetTimeDetailsHtmlPage(getWebClient(), userId, tdocId, true); 084 Assert.assertTrue("Calendar not loaded.", page.asText().contains("March 2011")); 085 086 HtmlForm form = page.getFormByName("TimeDetailActionForm"); 087 Assert.assertNotNull(form); 088 List<Assignment> assignments = TkServiceLocator.getAssignmentService().getAssignments(userId, JAN_AS_OF_DATE); 089 Assignment assignment = assignments.get(0); 090 091 List<EarnCode> earnCodes = TkServiceLocator.getEarnCodeService().getEarnCodesForTime(assignment, JAN_AS_OF_DATE); 092 EarnCode earnCode = earnCodes.get(0); 093 Assert.assertEquals("There should be no existing time blocks.", 0, fredsDocument.getTimeBlocks().size()); 094 095 // 2. Set Timeblock Start and End time 096 // 3/02/2011 - 8:00a to 6:00pm 097 // OVT - 0 Hrs Expected 098 DateTime start = new DateTime(2011, 3, 2, 8, 0, 0, 0, TKUtils.getSystemDateTimeZone()); 099 DateTime end = new DateTime(2011, 3, 2, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone()); 100 TimeDetailActionFormBase tdaf = TimeDetailTestUtils.buildDetailActionForm(fredsDocument, assignment, earnCode, start, end, null, false, null, true); 101 List<String> errors = TimeDetailTestUtils.setTimeBlockFormDetails(form, tdaf); 102 Assert.assertEquals("There should be no errors in this time detail submission", 0, errors.size()); 103 page = TimeDetailTestUtils.submitTimeDetails(getWebClient(), getTimesheetDocumentUrl(tdocId), tdaf); 104 Assert.assertNotNull(page); 105 106 String dataText = page.getElementById("timeBlockString").getFirstChild().getNodeValue(); 107 JSONArray jsonData = (JSONArray) JSONValue.parse(dataText); 108 final JSONObject jsonDataObject = (JSONObject) jsonData.get(0); 109 Assert.assertTrue("TimeBlock Data Missing.", checkJSONValues(new JSONObject() {{ put("outer", jsonDataObject); }}, 110 new ArrayList<Map<String, Object>>() {{ 111 add(new HashMap<String, Object>() {{ 112 put("earnCode", "RGN"); 113 put("hours", "5.0"); 114 put("amount", null); 115 }}); 116 }}, 117 new HashMap<String, Object>() {{ 118 put("earnCode", "RGN"); 119 put("startNoTz", "2011-03-02T08:00:00"); 120 put("endNoTz", "2011-03-02T13:00:00"); 121 put("title", "SDR1 Work Area"); 122 put("assignment", "30_30_30"); 123 }} 124 )); 125 126 // Set freds timesheet to have updated info. 127 fredsDocument = TkServiceLocator.getTimesheetService().openTimesheetDocument(userId, pcd); 128 } 129 130 /* 131 * Tests while Timesheet is in INITIATED state. 132 */ 133 134 @Test 135 public void testInitiatedTimesheetIsVisibleByAll() throws Exception { 136 // test valid users 137 for (String uid : VALID_NON_ENTRY_USERS) { 138 LOG.info("Testing visibility for " + uid); 139 HtmlPage page = loginAndGetTimeDetailsHtmlPage(getWebClient(), uid, fredsDocument.getDocumentId(), true); 140 Assert.assertTrue("Calendar not loaded.", page.asText().contains("March 2011")); 141 } 142 } 143 144 @Test 145 public void testInitiatedTimesheetIsNotVisible() throws Exception { 146 for (String uid : INVALID_NON_ENTRY_USERS) { 147 LOG.info("Testing visibility for " + uid); 148 HtmlPage page = loginAndGetTimeDetailsHtmlPage(getWebClient(), uid, fredsDocument.getDocumentId(), false); 149 //HtmlUnitUtil.createTempFile(page, "badlogin"); 150 Assert.assertTrue("Should not have access", page.asText().contains("You are not authorized to access this portion of the application.")); 151 } 152 } 153 154 public void testInitiatedTimesheetEditable(String userId) throws Exception { 155 // admin, add one timeblock 156 String tdocId = fredsDocument.getDocumentId(); 157 HtmlPage page = loginAndGetTimeDetailsHtmlPage(getWebClient(), userId, tdocId, true); 158 //HtmlUnitUtil.createTempFile(page, "loggedin"); 159 Assert.assertTrue("Calendar not loaded.", page.asText().contains("March 2011")); 160 161 HtmlForm form = page.getFormByName("TimeDetailActionForm"); 162 Assert.assertNotNull(form); 163 List<Assignment> assignments = TkServiceLocator.getAssignmentService().getAssignments("fred", JAN_AS_OF_DATE); 164 Assignment assignment = assignments.get(0); 165 166 List<EarnCode> earnCodes = TkServiceLocator.getEarnCodeService().getEarnCodesForTime(assignment, JAN_AS_OF_DATE); 167 EarnCode earnCode = earnCodes.get(0); 168 169 Assert.assertEquals("There should be one existing time block.", 1, fredsDocument.getTimeBlocks().size()); 170 171 DateTime start = new DateTime(2011, 3, 4, 8, 0, 0, 0, TKUtils.getSystemDateTimeZone()); 172 DateTime end = new DateTime(2011, 3, 4, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone()); 173 TimeDetailActionFormBase tdaf = TimeDetailTestUtils.buildDetailActionForm(fredsDocument, assignment, earnCode, start, end, null, false, null, true); 174 List<String> errors = TimeDetailTestUtils.setTimeBlockFormDetails(form, tdaf); 175 Assert.assertEquals("There should be no errors in this time detail submission", 0, errors.size()); 176 page = TimeDetailTestUtils.submitTimeDetails(getWebClient(), getTimesheetDocumentUrl(tdocId), tdaf); 177 Assert.assertNotNull(page); 178 HtmlUnitUtil.createTempFile(page, "initiatetest"); 179 180 String dataText = page.getElementById("timeBlockString").getFirstChild().getNodeValue(); 181 JSONArray jsonData = (JSONArray) JSONValue.parse(dataText); 182 final JSONObject jsonDataObject = (JSONObject) jsonData.get(1); 183 Assert.assertTrue("TimeBlock Data Missing.", checkJSONValues(new JSONObject() {{ put("outer", jsonDataObject); }}, 184 new ArrayList<Map<String, Object>>() {{ 185 add(new HashMap<String, Object>() {{ 186 put("earnCode", "RGN"); 187 put("hours", "5.0"); 188 put("amount", null); 189 }}); 190 }}, 191 new HashMap<String, Object>() {{ 192 put("earnCode", "RGN"); 193 put("startNoTz", "2011-03-04T08:00:00"); 194 put("endNoTz", "2011-03-04T13:00:00"); 195 put("title", "SDR1 Work Area"); 196 put("assignment", "30_30_30"); 197 }} 198 )); 199 } 200 201 public void testInitiatedTimesheetNotEditable(String userId) throws Exception { 202 // admin, add one timeblock 203 String tdocId = fredsDocument.getDocumentId(); 204 HtmlPage page = loginAndGetTimeDetailsHtmlPage(getWebClient(), userId, tdocId, true); 205 //HtmlUnitUtil.createTempFile(page, "loggedin"); 206 Assert.assertTrue("Calendar not loaded.", page.asText().contains("March 2011")); 207 208 HtmlForm form = page.getFormByName("TimeDetailActionForm"); 209 Assert.assertNotNull(form); 210 List<Assignment> assignments = TkServiceLocator.getAssignmentService().getAssignments("fred", JAN_AS_OF_DATE); 211 Assignment assignment = assignments.get(0); 212 213 List<EarnCode> earnCodes = TkServiceLocator.getEarnCodeService().getEarnCodesForTime(assignment, JAN_AS_OF_DATE); 214 EarnCode earnCode = earnCodes.get(0); 215 216 Assert.assertEquals("There should be one existing time block.", 1, fredsDocument.getTimeBlocks().size()); 217 218 DateTime start = new DateTime(2011, 3, 4, 8, 0, 0, 0, TKUtils.getSystemDateTimeZone()); 219 DateTime end = new DateTime(2011, 3, 4, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone()); 220 TimeDetailActionFormBase tdaf = TimeDetailTestUtils.buildDetailActionForm(fredsDocument, assignment, earnCode, start, end, null, false, null, true); 221 List<String> errors = TimeDetailTestUtils.setTimeBlockFormDetails(form, tdaf); 222 Assert.assertEquals("There should be no errors in this time detail submission", 0, errors.size()); 223 page = TimeDetailTestUtils.submitTimeDetails(getWebClient(), userId, getTimesheetDocumentUrl(tdocId), tdaf); 224 Assert.assertNotNull(page); 225 HtmlUnitUtil.createTempFile(page, "aftertdadd"); 226 Assert.assertTrue("Should not have access", page.asText().contains("You are not authorized to access this portion of the application.")); 227 } 228 229 @Test 230 public void testInitiatedTimesheetIsEditableByAdmin() throws Exception { 231 testInitiatedTimesheetEditable("admin"); 232 } 233 234 @Test 235 public void testInitiatedTimesheetIsEditableByApprover() throws Exception { 236 testInitiatedTimesheetEditable("fran"); 237 } 238 239 @Test 240 public void testInitiatedTimesheetIsEditableByReviewer() throws Exception { 241 testInitiatedTimesheetEditable("frank"); 242 } 243 244 @Test 245 public void testInitiatedTimesheetIs_NOT_EditableByViewOnly() throws Exception { 246 testInitiatedTimesheetNotEditable("edna"); 247 } 248 249 @Test 250 public void testInitiatedTimesheetIs_NOT_EditableByDeptAdmin() throws Exception { 251 testInitiatedTimesheetNotEditable("testuser6"); 252 } 253 254 255 @Test 256 public void testInitiatedTimesheetSubmitUser() throws Exception { 257 // User, 258 // Check for submit button. 259 // Click Button 260 } 261 262 @Test 263 public void testInitiatedTimesheetSubmitAdmin() throws Exception { 264 // Admin 265 // Check for submit button. 266 // Click Button 267 } 268 269 @Test 270 public void testInitiatedTimesheetSubmitApprover() throws Exception { 271 // Approver 272 // Check for submit button. 273 // Click Button 274 } 275 276 277 @Test 278 public void testInitiatedTimesheetIs_NOT_SubmittableByUsers() throws Exception { 279 // DeptAdmin, View Only, Reviewer 280 // Check that submit button is not present. 281 } 282 283 /* 284 * Test for ENROUTE state. 285 */ 286 287 @Test 288 public void testEnrouteTimesheetIsVisibleByAll() throws Exception { 289 // test valid users 290 } 291 292 @Test 293 public void testEnrouteTimesheetIsNotVisible() throws Exception { 294 // make sure invalid users do not have access 295 } 296 297 @Test 298 public void testEnrouteTimesheetIsEditableByAdmin() throws Exception { 299 // admin, add one timeblock 300 } 301 302 @Test 303 public void testEnrouteTimesheetIsEditableByApprover() throws Exception { 304 // approver, add one timeblock 305 } 306 307 @Test 308 public void testEnrouteTimesheetIsEditableByReviewer() throws Exception { 309 // reviewer add one timeblock. 310 } 311 312 @Test 313 public void testEnrouteTimesheetIs_NOT_EditableByViewOnly() throws Exception { 314 } 315 316 @Test 317 public void testEnrouteTimesheetIs_NOT_EditableByDeptAdmin() throws Exception { 318 } 319 320 321 @Test 322 public void testEnrouteTimesheet_NOT_Approvable() throws Exception { 323 // User, Reviewer, View Only, Dept Admin 324 // Check for approve button 325 } 326 327 @Test 328 public void testEnrouteTimesheetApproveAdmin() throws Exception { 329 // Admin 330 // Check for approve button. 331 // Click Button 332 } 333 334 @Test 335 public void testEnrouteTimesheetApproveApprover() throws Exception { 336 // Approver 337 // Check for approve button. 338 // Click Button 339 } 340 341 @Test 342 public void testEnrouteTimesheetIs_NOT_SubmittableByUsers() throws Exception { 343 // DeptAdmin, View Only, Reviewer 344 // Check that submit button is not present. 345 } 346 347 348 /* 349 * Final State 350 */ 351 352 @Test 353 public void testFinalTimesheetIsVisibleByAll() throws Exception { 354 // test valid users 355 } 356 357 @Test 358 public void testFinalTimesheetIsNotVisible() throws Exception { 359 // make sure invalid users do not have access 360 } 361 362 @Test 363 public void testFinalTimesheetIsNotEditable() throws Exception { 364 // by everyone but admin 365 } 366 367 @Test 368 public void testFinalTimesheetIsAdminEditable() throws Exception { 369 // admin, add timeblock. 370 } 371 372 /** 373 * Verifies that each admin/approver/reviewer login is active for this test. 374 */ 375 private void verifyLogins(TimesheetDocument tdoc) throws Exception { 376 for (String userId : VALID_NON_ENTRY_USERS) { 377 String tdocId = tdoc.getDocumentId(); 378 HtmlPage page = loginAndGetTimeDetailsHtmlPage(getWebClient(), userId, tdocId, true); 379 Assert.assertTrue("Calendar not loaded.", page.asText().contains("March 2011")); 380 } 381 } 382 383 }