/*
* 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.coa.document.validation.impl;
import static org.kuali.kfs.sys.KualiTestAssertionUtils.assertGlobalMessageMapEmpty;
import static org.kuali.kfs.sys.KualiTestAssertionUtils.assertGlobalMessageMapSize;
import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley;
import org.kuali.kfs.coa.businessobject.A21SubAccount;
import org.kuali.kfs.coa.businessobject.SubAccount;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.KFSKeyConstants;
import org.kuali.kfs.sys.fixture.SubAccountFixture;
import org.kuali.kfs.sys.fixture.UserNameFixture;
import org.kuali.rice.kns.document.MaintenanceDocument;
import org.kuali.rice.krad.util.GlobalVariables;
@ConfigureContext(session = khuntley)
public class SubAccountRuleTest extends ChartRuleTestBase {
protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SubAccountRuleTest.class);
private static final String GOOD_CHART = "UA";
private static final String GOOD_ACCOUNT = "1912201";
private static final String NEW_SUBACCOUNT_NUMBER = "12345";
private static final String NEW_SUBACCOUNT_NAME = "A New SubAccount";
// CG authorized test users
private static final UserNameFixture GOOD_CG_USERID = UserNameFixture.kcopley;
private static final UserNameFixture BAD_CG_USERID = UserNameFixture.jhavens;
SubAccount newSubAccount;
SubAccount oldSubAccount;
MaintenanceDocument maintDoc;
/**
* This method creates a new SubAccount, and populates it with the data provided. No fields are required for this method, though
* some may be for the rules. This method calls subAccount.refresh() before returning it, so all sub-objects should be
* populated, if the keys match any records in the corresponding tables. This method does not populate anything in the contained
* A21SubAccount, though it does create a new A21SubAccount. So the A21SubAccount instance will be valid (ie, non-null), but all
* of its fields will be default or null.
*
* @param chartOfAccountsCode
* @param accountNumber
* @param subAccountNumber
* @param subAccountName
* @param active
* @param finReportChartCode
* @param finReportOrgCode
* @param finReportingCode
* @return returns a SubAccount instance populated with the data provided
*/
private SubAccount newSubAccount(String chartOfAccountsCode, String accountNumber, String subAccountNumber, String subAccountName, boolean active, String finReportChartCode, String finReportOrgCode, String finReportingCode) {
SubAccount subAccount = new SubAccount();
subAccount.setChartOfAccountsCode(chartOfAccountsCode);
subAccount.setAccountNumber(accountNumber);
subAccount.setSubAccountNumber(subAccountNumber);
subAccount.setSubAccountName(subAccountName);
subAccount.setActive(active);
subAccount.setFinancialReportChartCode(finReportChartCode);
subAccount.setFinReportOrganizationCode(finReportOrgCode);
subAccount.setFinancialReportingCode(finReportingCode);
subAccount.refresh();
addA21SubAccount(subAccount);
return subAccount;
}
/**
* add a dummy object for a21SubAccount
*
* @param sub
*/
private void addA21SubAccount(SubAccount sub){
A21SubAccount a21 = new A21SubAccount();
a21.setChartOfAccountsCode(sub.getChartOfAccountsCode());
a21.setAccountNumber(sub.getAccountNumber());
a21.refresh();
sub.setA21SubAccount(a21);
}
public void testCheckForPartiallyEnteredReportingFields_nullChartAndAccount() {
SubAccountRule rule = new SubAccountRule();
// setup rule, document, and bo
newSubAccount = newSubAccount(null, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, null, null, null);
rule = (SubAccountRule) setupMaintDocRule(newSubAccount, rule.getClass());
// confirm that there are no errors to begin with
assertGlobalMessageMapEmpty();
// run the rule, should return true
assertEquals(true, rule.checkForPartiallyEnteredReportingFields());
assertGlobalMessageMapEmpty();
}
public void testCheckForPartiallyEnteredReportingFields_goodChartNullAccount() {
SubAccountRule rule = new SubAccountRule();
// setup rule, document, and bo
newSubAccount = newSubAccount(GOOD_CHART, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, null, null, null);
rule = (SubAccountRule) setupMaintDocRule(newSubAccount, rule.getClass());
// confirm that there are no errors to begin with
assertGlobalMessageMapEmpty();
// run the rule, should return true
assertEquals(true, rule.checkForPartiallyEnteredReportingFields());
assertGlobalMessageMapEmpty();
}
public void testCheckForPartiallyEnteredReportingFields_nullChartGoodAccount() {
SubAccountRule rule = new SubAccountRule();
// setup rule, document, and bo
newSubAccount = newSubAccount(null, GOOD_ACCOUNT, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, null, null, null);
rule = (SubAccountRule) setupMaintDocRule(newSubAccount, rule.getClass());
// confirm that there are no errors to begin with
assertGlobalMessageMapEmpty();
// run the rule, should return true
assertEquals(true, rule.checkForPartiallyEnteredReportingFields());
assertGlobalMessageMapEmpty();
}
public void testCheckForPartiallyEnteredReportingFields_goodChartAndAccount() {
SubAccountRule rule = new SubAccountRule();
// setup rule, document, and bo
newSubAccount = newSubAccount(GOOD_CHART, GOOD_ACCOUNT, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, null, null, null);
rule = (SubAccountRule) setupMaintDocRule(newSubAccount, rule.getClass());
// confirm that there are no errors to begin with
assertGlobalMessageMapEmpty();
// run the rule, should return true
assertEquals(true, rule.checkForPartiallyEnteredReportingFields());
assertGlobalMessageMapEmpty();
}
private void proveNotAllFinReportCodesEntered(SubAccount subAccount) {
// setup the rule, and inject the subaccount
SubAccountRule rule = new SubAccountRule();
rule = (SubAccountRule) setupMaintDocRule(newSubAccount, rule.getClass());
// confirm that there are no errors to begin with
assertGlobalMessageMapEmpty();
// run the rule, should return true
boolean result = rule.checkForPartiallyEnteredReportingFields();
assertEquals(false, result);
assertGlobalMessageMapSize(1);
assertGlobalErrorExists(KFSKeyConstants.ERROR_DOCUMENT_SUBACCTMAINT_RPTCODE_ALL_FIELDS_IF_ANY_FIELDS);
GlobalVariables.getMessageMap().clearErrorMessages();
}
public void testCheckForPartiallyEnteredReportingFields_notAllFinReportCodesEntered() {
// setup rule, document, and bo
newSubAccount = newSubAccount(null, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, "UA", null, null);
proveNotAllFinReportCodesEntered(newSubAccount);
// setup rule, document, and bo
newSubAccount = newSubAccount(null, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, null, "KUL", null);
proveNotAllFinReportCodesEntered(newSubAccount);
// setup rule, document, and bo
newSubAccount = newSubAccount(null, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, null, null, "KUL");
proveNotAllFinReportCodesEntered(newSubAccount);
// setup rule, document, and bo
newSubAccount = newSubAccount(null, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, "UA", "KUL", null);
proveNotAllFinReportCodesEntered(newSubAccount);
// setup rule, document, and bo
newSubAccount = newSubAccount(null, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, "UA", null, "KUL");
proveNotAllFinReportCodesEntered(newSubAccount);
// setup rule, document, and bo
newSubAccount = newSubAccount(null, null, NEW_SUBACCOUNT_NUMBER, NEW_SUBACCOUNT_NAME, true, null, "KUL", "KUL");
proveNotAllFinReportCodesEntered(newSubAccount);
}
public void testCheckCgRules_badFundGroup() {
SubAccountRule rule = new SubAccountRule();
// setup rule, document, and bo
newSubAccount = SubAccountFixture.SUB_ACCOUNT_WITH_BAD_CG_FUND_GROUP.createSubAccount();
newSubAccount.refresh();
newSubAccount.setA21SubAccount(null);
rule = (SubAccountRule) setupMaintDocRule(newSubAccount, rule.getClass());
// confirm that there are no errors to begin with
assertGlobalMessageMapEmpty();
assertEquals(true, rule.checkCgRules(maintDoc));
//System.out.println( GlobalVariables.getMessageMap().entrySet() );
}
public void testCheckCgRules_badA21SubAccountAccountType() throws Exception {
SubAccountRule rule = new SubAccountRule();
// setup rule, document, and bo
newSubAccount = SubAccountFixture.A21_SUB_ACCOUNT_WITH_BAD_CG_ACCOUNT_TYPE.createSubAccount();
newSubAccount.getA21SubAccount().refresh();
String fieldName = "a21SubAccount.subAccountTypeCode";
rule = (SubAccountRule) setupMaintDocRule(newSubAccount, rule.getClass());
// confirm that there are no errors to begin with
assertGlobalMessageMapEmpty();
assertEquals(false, rule.checkCgRules(maintDoc));
assertFieldErrorExists(fieldName, KFSKeyConstants.ERROR_DOCUMENT_SUBACCTMAINT_INVALI_SUBACCOUNT_TYPE_CODES);
assertGlobalMessageMapSize(1);
}
/**
* Incomplete TODO: Write tests for this method to accompany the testCheckCgRules
*/
/*
* public void testCheckCgCostSharingRules() { }
*/
/**
* Incomplete TODO: Write tests for this method to accompany the testCheckCgRules
*/
/*
* public void testCheckCgIcrRules() { }
*/
}