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