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.balancetransfer; 017 import static org.junit.Assert.*; 018 019 import java.math.BigDecimal; 020 import java.sql.Date; 021 import java.util.ArrayList; 022 import java.util.List; 023 024 import junit.framework.Assert; 025 026 import org.joda.time.DateTime; 027 import org.joda.time.Interval; 028 import org.junit.Test; 029 import org.kuali.hr.lm.leave.web.LeaveCalendarWSForm; 030 import org.kuali.hr.lm.leaveCalendar.LeaveCalendarWebTestBase; 031 import org.kuali.hr.lm.leaveSummary.LeaveSummary; 032 import org.kuali.hr.lm.leaveSummary.LeaveSummaryRow; 033 import org.kuali.hr.lm.leaveblock.LeaveBlock; 034 import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument; 035 import org.kuali.hr.lm.leavecalendar.web.LeaveCalendarSubmitForm; 036 import org.kuali.hr.lm.util.LeaveCalendarTestUtils; 037 import org.kuali.hr.test.KPMETestCase; 038 import org.kuali.hr.time.calendar.CalendarEntries; 039 import org.kuali.hr.time.service.base.TkServiceLocator; 040 import org.kuali.hr.time.test.HtmlUnitUtil; 041 import org.kuali.hr.time.test.TkTestConstants; 042 import org.kuali.hr.time.util.TKUtils; 043 import org.kuali.hr.time.util.TkConstants; 044 045 import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController; 046 import com.gargoylesoftware.htmlunit.WebClient; 047 import com.gargoylesoftware.htmlunit.html.HtmlPage; 048 049 050 public class BalanceTransferTest extends LeaveCalendarWebTestBase { 051 052 public static final String USER_PRINCIPAL_ID = "admin"; 053 private Date JAN_AS_OF_DATE = new Date((new DateTime(2010, 1, 1, 0, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis()); 054 private BalanceTransfer balanceTransfer; 055 056 @Override 057 public void setUp() throws Exception { 058 super.setUp(); 059 setBaseDetailURL(TkTestConstants.Urls.LEAVE_CALENDAR_SUBMIT_URL + "?documentId="); 060 balanceTransfer = new BalanceTransfer(); 061 balanceTransfer.setTransferAmount(new BigDecimal(20)); 062 balanceTransfer.setForfeitedAmount(new BigDecimal(0)); 063 balanceTransfer.setAmountTransferred(new BigDecimal(10)); 064 balanceTransfer.setAccrualCategoryRule("5000"); 065 } 066 067 @Test 068 public void testTransferWithAccrualRule() throws Exception { 069 BalanceTransfer btd = new BalanceTransfer(); 070 //btd.setCreditedAccrualCategory(TKTestUtils.creat) 071 assertTrue("Dummy assertion",true); 072 } 073 074 @Test 075 public void testAdjustLowerTransferAmount() { 076 BigDecimal adjustedTransferAmount = new BigDecimal(10); 077 balanceTransfer = balanceTransfer.adjust(adjustedTransferAmount); 078 079 assertTrue("Transfer Amount not equals", balanceTransfer.getTransferAmount().compareTo(adjustedTransferAmount) == 0); 080 assertTrue("Forfeited amount not updated", balanceTransfer.getForfeitedAmount().compareTo(new BigDecimal(10)) == 0); 081 assertTrue(balanceTransfer.getAmountTransferred().compareTo(new BigDecimal(5)) == 0); 082 } 083 084 @Test 085 public void testAdjustLowerTransferAmountWithForfeiture() { 086 BigDecimal adjustedTransferAmount = new BigDecimal(10); 087 balanceTransfer.setForfeitedAmount(new BigDecimal(10)); 088 balanceTransfer = balanceTransfer.adjust(adjustedTransferAmount); 089 090 assertTrue("Transfer Amount not equals", balanceTransfer.getTransferAmount().compareTo(adjustedTransferAmount) == 0); 091 assertTrue("Forfeited amount not updated", balanceTransfer.getForfeitedAmount().compareTo(new BigDecimal(20)) == 0); 092 assertTrue(balanceTransfer.getAmountTransferred().compareTo(new BigDecimal(5)) == 0); 093 } 094 095 @Test 096 public void testAdjustRaiseTransferAmount() { 097 BigDecimal adjustedTransferAmount = new BigDecimal(30); 098 balanceTransfer = balanceTransfer.adjust(adjustedTransferAmount); 099 100 assertTrue("Transfer Amount not equals", balanceTransfer.getTransferAmount().compareTo(adjustedTransferAmount) == 0); 101 assertTrue("Forfeited amount not updated", balanceTransfer.getForfeitedAmount().compareTo(BigDecimal.ZERO) == 0); 102 assertTrue(balanceTransfer.getAmountTransferred().compareTo(new BigDecimal(15)) == 0); 103 } 104 105 @Test 106 public void testAdjustRaiseTransferAmountWithForfeitureLessThanDifference() { 107 BigDecimal adjustedTransferAmount = new BigDecimal(40); 108 balanceTransfer.setForfeitedAmount(new BigDecimal(10)); 109 110 balanceTransfer = balanceTransfer.adjust(adjustedTransferAmount); 111 112 assertTrue("Transfer Amount not equals", balanceTransfer.getTransferAmount().compareTo(adjustedTransferAmount) == 0); 113 assertTrue("Forfeited amount not updated", balanceTransfer.getForfeitedAmount().compareTo(BigDecimal.ZERO) == 0); 114 assertTrue(balanceTransfer.getAmountTransferred().compareTo(new BigDecimal(20)) == 0); 115 } 116 117 @Test 118 public void testAdjustRaiseTransferAmountWithForfeitureMoreThanDifference() { 119 BigDecimal adjustedTransferAmount = new BigDecimal(30); 120 balanceTransfer.setForfeitedAmount(new BigDecimal(15)); 121 balanceTransfer = balanceTransfer.adjust(adjustedTransferAmount); 122 123 assertTrue("Transfer Amount not equals", balanceTransfer.getTransferAmount().compareTo(adjustedTransferAmount) == 0); 124 assertTrue("Forfeited amount not updated", balanceTransfer.getForfeitedAmount().compareTo(new BigDecimal(5)) == 0); 125 assertTrue(balanceTransfer.getAmountTransferred().compareTo(new BigDecimal(15)) == 0); 126 } 127 128 /** 129 * Tests balance transfers triggered by max balance action frequency "leave approve" 130 * Specifically, when a single accrual category has exceeded the max balance defined by the 131 * accrual category's rules, max balance action frequency is leave approve, and action at max balance is transfer. 132 * Would be better placed in LeaveCalendarWorkflowIntegrationTest. 133 * @throws Exception 134 */ 135 @Test 136 public void testSingleLeaveApproveBalanceTransfer() throws Exception { 137 //Create a leave summary with a single row containing an accrual category that has exceeded max balance limit. 138 //Generate accrual entries for debitAC1 and creditAC1 139 LeaveSummary ls = new LeaveSummary(); 140 141 //Leave summary is created on the fly 142 Date startDate = new Date((new DateTime(2012, 1, 1, 0, 0, 0, 1, TKUtils.getSystemDateTimeZone())).getMillis()); 143 Date asOfDate = new Date((new DateTime(2012, 11, 1, 12, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis()); 144 TkServiceLocator.getAccrualService().runAccrual(USER_PRINCIPAL_ID,startDate,asOfDate,false); 145 CalendarEntries pcd = TkServiceLocator.getCalendarService().getCurrentCalendarDatesForLeaveCalendar(USER_PRINCIPAL_ID, asOfDate); 146 Assert.assertNotNull("No CalendarEntries", pcd); 147 148 //opens a leave calendar document and initiates a workflow document. Sets document status to Initiated. 149 LeaveCalendarDocument tdoc = TkServiceLocator.getLeaveCalendarService().openLeaveCalendarDocument(USER_PRINCIPAL_ID, pcd); 150 String tdocId = tdoc.getDocumentId(); 151 152 // Build an action form - we're using it as a POJO, it ties into the 153 // existing TK validation setup 154 //Can be removed if LeaveCalendarService.openLeaveCalendarDocument takes on the task. 155 ls = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(USER_PRINCIPAL_ID, pcd); 156 LeaveCalendarWSForm tdaf = LeaveCalendarTestUtils.buildLeaveCalendarFormForSubmission(tdoc, ls); 157 LeaveCalendarSubmitForm lcsf = new LeaveCalendarSubmitForm(); 158 lcsf.setAction(TkConstants.DOCUMENT_ACTIONS.ROUTE); 159 lcsf.setDocumentId(tdaf.getDocumentId()); 160 for(LeaveSummaryRow lsRow : ls.getLeaveSummaryRows()) { 161 System.out.println("Accrued balance : " + lsRow.getAccruedBalance()); 162 } 163 HtmlPage page = LeaveCalendarTestUtils.submitLeaveCalendar2(getLeaveCalendarUrl(tdocId), tdaf); 164 //LeaveCalendarWSForm extends LeaveCalendarForm. In order to fully implement this test, a LeaveCalendarSubmitForm must be created 165 //with an action of "DOCUMENT_ACTIONS.ROUTE". 166 Assert.assertNotNull(page); 167 HtmlUnitUtil.createTempFile(page, "LeaveBlockPresent"); 168 169 // Verify block present on rendered page. 170 String pageAsText = page.asText(); 171 System.out.print(pageAsText); 172 173 174 //LeaveCalendarWSForm mockForm = LeaveCalendarTestUtils.buildLeaveCalendarForm(tdoc, assignment, earnCode, start, end, null, true); 175 //Attach leave summary to relevant object (leavecalendardocument?) 176 //load LeaveCalendarDocument into web container 177 //leave calendar document must have status "initiated" 178 //mock the submit action on behalf of the principal who owns the leave calendar. 179 //redirect should occur, which loads the balance transfer document. 180 //balance transfer document should have all fields locked except for transfer amount. 181 //mock transfer action on behalf of the principal. 182 //verify leave block creation 183 assertTrue("Dummy assertion 2", true); 184 } 185 186 /** 187 * Tests balance transfers triggered by max balance action frequency "leave approve" 188 * Specifically, when multiple accrual categories have exceeded the max balance defined by the 189 * accrual category's rules, max balance action frequency is leave approve, and action at max balance is transfer. 190 */ 191 @Test 192 public void testMultipleLeaveApproveBalanceTransfer() throws Exception { 193 //Create a leave summary with multiple rows containing an accrual category that has exceeded max balance limit. 194 //Attach leave summary to relevant object (leavecalendardocument?) 195 //load LeaveCalendarDocument into web container 196 //leave calendar document must have status "initiated" 197 //mock the submit action on behalf of the principal who owns the leave calendar. 198 //redirect should occur, which loads the balance transfer document. 199 //balance transfer document should have all fields locked except for transfer amount. 200 //mock transfer action on behalf of the principal. 201 //verify transfer action has been triggered the correct number of times. 202 //verify the correct number of leave blocks have been generated? 203 assertTrue("Dummy assertion 3",true); 204 } 205 206 /** 207 * Tests leave calendar submit action does not trigger action redirects for balance transfer 208 * submission when no accrual category is eligable for transfer. 209 */ 210 @Test 211 public void testNoEligibleAccrualCategorysForLeaveApproveBalanceTransfer() throws Exception { 212 //Create leave summary with x number of rows, none of which contain an accrual category that has exceeded its limt. 213 //Attach leave summary to relevant object (leavecalendardocument?) 214 //load LeaveCalendarDocument into web container 215 //leave calendar document must have status "initiated" 216 //mock the submit action on behalf of the principal who owns the leave calendar. 217 //redirect should occur, which loads the balance transfer document. 218 //balance transfer document should have all fields locked except for transfer amount. 219 //mock transfer action on behalf of the principal. 220 //verify transfer action has been triggered the correct number of times. 221 //verify the correct number of leave blocks have been generated? 222 assertTrue("Dummy assertion 4", true); 223 } 224 225 /** 226 * Test the lookup results page, there should not be "edit" actions, only "view" actions 227 * @throws Exception 228 */ 229 @Test 230 public void testLookupPage() throws Exception { 231 HtmlPage btLookup = HtmlUnitUtil.gotoPageAndLogin(TkTestConstants.Urls.BALANCE_TRANSFER_MAINT_URL); 232 btLookup = HtmlUnitUtil.clickInputContainingText(btLookup, "search"); 233 System.out.println(btLookup.asXml()); 234 Assert.assertTrue("Page contains test Balance Transfer", btLookup.asText().contains("fromAC")); 235 Assert.assertFalse("Page should not contain edit action", btLookup.asText().contains("edit")); 236 Assert.assertTrue("Page should contain view action", btLookup.asText().contains("view")); 237 } 238 239 240 }