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