/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.gl.businessobject.lookup; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.kuali.kfs.gl.Constant; import org.kuali.kfs.gl.businessobject.AccountBalance; import org.kuali.kfs.gl.businessobject.AccountBalanceByConsolidation; import org.kuali.kfs.gl.service.AccountBalanceService; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.lookup.LookupableSpringContext; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.context.TestUtils; /** * This class contains the test cases that can be applied to the method in AccountBalanceLookupableImpl class. */ @ConfigureContext public class AccountBalanceLookupableHelperServiceTest extends AbstractGeneralLedgerLookupableHelperServiceTestBase { private AccountBalanceService accountBalanceService; /** * Initializes the services needed for this test * @see org.kuali.kfs.gl.businessobject.lookup.AbstractGeneralLedgerLookupableHelperServiceTestBase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); setAccountBalanceService(SpringContext.getBean(AccountBalanceService.class)); lookupableHelperServiceImpl = LookupableSpringContext.getLookupableHelperService("glAccountBalanceLookupableHelperService"); lookupableHelperServiceImpl.setBusinessObjectClass(AccountBalanceByConsolidation.class); } /** * Covers the search results returned by AccountBalanceLookupableService * @throws Exception thrown if any exception is encountered for any reason * @see org.kuali.module.gl.web.lookupable.AbstractGLLookupableTestBase#testGetSearchResults() */ public void testGetSearchResults() throws Exception { testDataGenerator.generateTransactionData(pendingEntry); AccountBalance accountBalance = new AccountBalance(pendingEntry); // test the search results before the specified entry is inserted into the database Map fieldValues = getLookupFieldValues(accountBalance, true); List searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); assertTrue(!contains(searchResults, accountBalance)); // add a new entry into database. If complete this step, such entry should not in the database insertNewRecord(accountBalance); // test the search results with only the required fields fieldValues = getLookupFieldValues(accountBalance, true); searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); assertTrue(searchResults.size() == 1); assertTrue(contains(searchResults, accountBalance)); // add a new entry into database. If complete this step, such entry should not in the database // Here, we can reuse encumbrance declared above fieldValues = getLookupFieldValues(accountBalance, true); AccountBalance accountBalance1 = new AccountBalance(pendingEntry); accountBalance1.setSubAccountNumber(testDataGenerator.getPropertyValue("genericSubAccountNumber")); insertNewRecord(accountBalance1); // test the search results with all specified fields. The new record cannot meet the search criteria. fieldValues = getLookupFieldValues(accountBalance, true); searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); assertTrue(searchResults.size() == 1); assertTrue(!contains(searchResults, accountBalance1)); // test the search results with all specified fields. The new record cannot meet the search criteria. fieldValues = getLookupFieldValues(accountBalance, false); searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); assertTrue(searchResults.size() >= 2); assertTrue(contains(searchResults, accountBalance)); assertTrue(contains(searchResults, accountBalance1)); } /** * This method includes the test cases applied to the consolidation option: Consolidate and Detail * * @throws Exception thrown if any exception is encountered for any reason */ public void testConsolidationOption() throws Exception { // ensure the transaction data does not exist in enty table. Otherwise, execption may be raised testDataGenerator.generateTransactionData(pendingEntry); AccountBalance accountBalanceOne = new AccountBalance(pendingEntry); insertNewRecord(accountBalanceOne); // get the number of the search results before adding the second record into database Map fieldValues = getLookupFieldValues(accountBalanceOne, true); fieldValues.put(Constant.CONSOLIDATION_OPTION, Constant.CONSOLIDATION); List searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); int numOfFirstResults = searchResults.size(); String subAccountNumber = testDataGenerator.getPropertyValue("genericSubAccountNumber"); pendingEntry.setSubAccountNumber(subAccountNumber); AccountBalance accountBalanceTwo = new AccountBalance(pendingEntry); insertNewRecord(accountBalanceTwo); // test if the second record is consolidated with others fieldValues = getLookupFieldValues(accountBalanceOne, true); fieldValues.put(Constant.CONSOLIDATION_OPTION, Constant.CONSOLIDATION); searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); int numOfSecondResults = searchResults.size(); assertTrue(numOfSecondResults == numOfFirstResults); // test if the search results appear in details fieldValues = getLookupFieldValues(accountBalanceOne, false); fieldValues.put(Constant.CONSOLIDATION_OPTION, Constant.DETAIL); searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); int numOfThirdResults = searchResults.size(); assertTrue(numOfSecondResults < numOfThirdResults); } /** * This method includes the test cases applied to the consolidation option: Consolidate and Detail * * @throws Exception thrown if any exception is encountered for any reason */ public void testPerformance() throws Exception { long threshlod = 60000; // get the number of the search results before adding the second record into database AccountBalance accountBalance = new AccountBalance(); accountBalance.setAccountNumber("1031400"); accountBalance.setUniversityFiscalYear(TestUtils.getFiscalYearForTesting()); accountBalance.setChartOfAccountsCode("BL"); Map fieldValues = getLookupFieldValues(accountBalance, true); fieldValues.put(Constant.CONSOLIDATION_OPTION, Constant.CONSOLIDATION); long startTime = System.currentTimeMillis(); List searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); long endTime = System.currentTimeMillis(); long duration = endTime - startTime; System.out.println(duration + "ms"); assertTrue("Too slow", duration < threshlod); // test if the search results appear in details fieldValues = getLookupFieldValues(accountBalance, false); fieldValues.put(Constant.CONSOLIDATION_OPTION, Constant.DETAIL); startTime = System.currentTimeMillis(); searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues); endTime = System.currentTimeMillis(); duration = endTime - startTime; System.out.println(duration + "ms"); assertTrue("Too slow", duration < threshlod); } /** * Returns a List of field names to check in the search results * @param isExtended true if extended attributes should be included for checking, false otherwise * @return a List of field names to check * @see org.kuali.module.gl.web.lookupable.AbstractGLLookupableTestBase#getLookupFields(boolean) */ public List getLookupFields(boolean isExtended) { List lookupFields = new ArrayList(); lookupFields.add(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); lookupFields.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); lookupFields.add(KFSPropertyConstants.ACCOUNT_NUMBER); lookupFields.add(Constant.CONSOLIDATION_OPTION); // include the extended fields if (isExtended) { lookupFields.add(KFSPropertyConstants.SUB_ACCOUNT_NUMBER); lookupFields.add(KFSPropertyConstants.OBJECT_CODE); lookupFields.add(KFSPropertyConstants.SUB_OBJECT_CODE); } return lookupFields; } /** * This method inserts a new account balance record into database * * @param accounBalance the given account balance */ protected void insertNewRecord(AccountBalance accounBalance) { try { getAccountBalanceService().save(accounBalance); } catch (Exception e) { } } /** * Gets the accountBalanceService attribute. * * @return Returns the accountBalanceService. */ public AccountBalanceService getAccountBalanceService() { return accountBalanceService; } /** * Sets the accountBalanceService attribute value. * * @param accountBalanceService The accountBalanceService to set. */ public void setAccountBalanceService(AccountBalanceService accountBalanceService) { this.accountBalanceService = accountBalanceService; } }