/* * 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.module.purap.document.validation.impl; import static org.kuali.kfs.sys.fixture.UserNameFixture.parke; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.kuali.kfs.module.purap.PurapConstants; import org.kuali.kfs.module.purap.PurapPropertyConstants; import org.kuali.kfs.module.purap.businessobject.PaymentRequestAccount; import org.kuali.kfs.module.purap.businessobject.PaymentRequestItem; import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine; import org.kuali.kfs.module.purap.businessobject.PurApItem; import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem; import org.kuali.kfs.module.purap.businessobject.RequisitionItem; import org.kuali.kfs.module.purap.document.PaymentRequestDocument; import org.kuali.kfs.module.purap.document.PurchaseOrderDocument; import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument; import org.kuali.kfs.module.purap.document.RequisitionDocument; import org.kuali.kfs.module.purap.document.validation.PurapRuleTestBase; import org.kuali.kfs.module.purap.fixture.PurApAccountingLineFixture; import org.kuali.kfs.module.purap.fixture.PurApItemFixture; import org.kuali.kfs.module.purap.fixture.PurapAccountingServiceFixture; import org.kuali.kfs.module.purap.fixture.PurchaseOrderAccountingLineFixture; import org.kuali.kfs.module.purap.fixture.RequisitionDocumentFixture; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.validation.GenericValidation; import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEventBase; import org.kuali.kfs.sys.fixture.AccountingLineFixture; import org.kuali.rice.core.api.parameter.ParameterEvaluatorService; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.kns.service.DataDictionaryService; @ConfigureContext(session = parke, shouldCommitTransactions=true) public class PurchasingAccountsPayableDocumentRuleTest extends PurapRuleTestBase { private Map<String, GenericValidation> validations; ParameterService parameterService; protected void setUp() throws Exception { super.setUp(); validations = SpringContext.getBeansOfType(GenericValidation.class); if (null == parameterService) { parameterService = SpringContext.getBean(ParameterService.class); } } protected void tearDown() throws Exception { validations = null; super.tearDown(); } // Tests of checkNegativeAccountsValidation public void testCheckNegativeAccountsValidation_PositiveAmount() { RequisitionDocument doc = RequisitionDocumentFixture.REQ_ONLY_REQUIRED_FIELDS.createRequisitionDocument(); PurchasingAccountsPayableCheckNegativeAccountsValidation validation = (PurchasingAccountsPayableCheckNegativeAccountsValidation)validations.get("PurchasingAccountsPayable-checkNegativeAccountsValidation-test"); assertTrue( validation.validate(new AttributedDocumentEventBase("","", doc)) ); } public void testCheckNegativeAccountsValidation_NegativeAmount() { RequisitionDocument doc = RequisitionDocumentFixture.REQ_WITH_NEGATIVE_AMOUNT.createRequisitionDocument(); PurchasingAccountsPayableCheckNegativeAccountsValidation validation = (PurchasingAccountsPayableCheckNegativeAccountsValidation)validations.get("PurchasingAccountsPayable-checkNegativeAccountsValidation-test"); assertFalse( validation.validate(new AttributedDocumentEventBase("","", doc)) ); } // Tests of validateBelowTheLineValues private void validateBelowTheLineValues_TestHelper(String documentType, PurApItem item, String parameterString) { try { if (!parameterService.parameterExists(Class.forName(PurapConstants.PURAP_DETAIL_TYPE_CODE_MAP.get(documentType)), parameterString)) { fail("Parameter does not exist: "+parameterString+" for "+documentType); } else if (/*REFACTORME*/SpringContext.getBean(ParameterEvaluatorService.class).getParameterEvaluator(Class.forName(PurapConstants.PURAP_DETAIL_TYPE_CODE_MAP.get(documentType)), parameterString, item.getItemTypeCode()).evaluationSucceeds()) { RequisitionDocument doc = RequisitionDocumentFixture.REQ_ONLY_REQUIRED_FIELDS.createRequisitionDocument(); PurchasingAccountsPayableBelowTheLineValuesValidation validation = (PurchasingAccountsPayableBelowTheLineValuesValidation)validations.get("PurchasingAccountsPayable-belowTheLineValuesValidation"); item.setPurapDocument(doc); validation.setItemForValidation(item); assertTrue( validation.validate(new AttributedDocumentEventBase("","", doc))); } else { RequisitionDocument doc = RequisitionDocumentFixture.REQ_ONLY_REQUIRED_FIELDS.createRequisitionDocument(); PurchasingAccountsPayableBelowTheLineValuesValidation validation = (PurchasingAccountsPayableBelowTheLineValuesValidation)validations.get("PurchasingAccountsPayable-belowTheLineValuesValidation"); item.setPurapDocument(doc); validation.setItemForValidation(item); assertFalse( validation.validate(new AttributedDocumentEventBase("","",doc)) ); } } catch (ClassNotFoundException cnfe) { fail(cnfe.toString()); } } public void testValidateBelowTheLineValues_Req_Freight_Positive() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(RequisitionDocument.class); PurApItem item = PurApItemFixture.VALID_FREIGHT_ITEM.createPurApItem(RequisitionItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_POSITIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_Req_Freight_Negative() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(RequisitionDocument.class); PurApItem item = PurApItemFixture.NEGATIVE_FREIGHT_ITEM.createPurApItem(RequisitionItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_NEGATIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_Req_Freight_Zero() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(RequisitionDocument.class); PurApItem item = PurApItemFixture.ZERO_FREIGHT_ITEM.createPurApItem(RequisitionItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_ZERO; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_Req_ShippingHandling_Positive() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(RequisitionDocument.class); PurApItem item = PurApItemFixture.VALID_SHIPPING_AND_HANDLING_ITEM.createPurApItem(RequisitionItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_POSITIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_Req_ShippingHandling_Negative() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(RequisitionDocument.class); PurApItem item = PurApItemFixture.NEGATIVE_SHIPPING_AND_HANDLING_ITEM.createPurApItem(RequisitionItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_NEGATIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_Req_ShippingHandling_Zero() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(RequisitionDocument.class); PurApItem item = PurApItemFixture.ZERO_SHIPPING_AND_HANDLING_ITEM.createPurApItem(RequisitionItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_ZERO; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_PREQ_Freight_Positive() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(PaymentRequestDocument.class); PurApItem item = PurApItemFixture.VALID_FREIGHT_ITEM.createPurApItem(PaymentRequestItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_POSITIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_PREQ_Freight_Negative() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(PaymentRequestDocument.class); PurApItem item = PurApItemFixture.NEGATIVE_FREIGHT_ITEM.createPurApItem(PaymentRequestItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_NEGATIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_PREQ_Freight_Zero() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(PaymentRequestDocument.class); PurApItem item = PurApItemFixture.ZERO_FREIGHT_ITEM.createPurApItem(PaymentRequestItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_ZERO; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_PREQ_ShippingHandling_Positive() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(PaymentRequestDocument.class); PurApItem item = PurApItemFixture.VALID_SHIPPING_AND_HANDLING_ITEM.createPurApItem(PaymentRequestItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_POSITIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_PREQ_ShippingHandling_Negative() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(PaymentRequestDocument.class); PurApItem item = PurApItemFixture.NEGATIVE_SHIPPING_AND_HANDLING_ITEM.createPurApItem(PaymentRequestItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_NEGATIVE; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } public void testValidateBelowTheLineValues_PREQ_ShippingHandling_Zero() { String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(PaymentRequestDocument.class); PurApItem item = PurApItemFixture.ZERO_SHIPPING_AND_HANDLING_ITEM.createPurApItem(PaymentRequestItem.class); String parameterString = PurapConstants.ITEM_ALLOWS_ZERO; validateBelowTheLineValues_TestHelper(documentType, item, parameterString); } // Tests of verifyHasAccounts public void testVerifyHasAccounts_Positive() { List<PurApAccountingLine> purAccounts = new ArrayList<PurApAccountingLine>(); PurApAccountingLineFixture purApAcctLineFixture = PurApAccountingLineFixture.BASIC_ACCOUNT_1; PurApAccountingLine purApAcctLine1 = purApAcctLineFixture.createPurApAccountingLine(PaymentRequestAccount.class, AccountingLineFixture.PURAP_LINE1); purAccounts.add(purApAcctLine1); PurchaseOrderItem item = new PurchaseOrderItem(); item.setSourceAccountingLines(purAccounts); PurchasingAccountsPayableHasAccountsValidation validation = (PurchasingAccountsPayableHasAccountsValidation)validations.get("PurchasingAccountsPayable-hasAccountsValidation"); validation.setItemForValidation(item); assertTrue( validation.validate(null) ); } public void testVerifyHasAccounts_Negative() { List<PurApAccountingLine> purAccounts = new ArrayList<PurApAccountingLine>(); PurchaseOrderItem item = new PurchaseOrderItem(); item.setSourceAccountingLines(purAccounts); PurchasingAccountsPayableHasAccountsValidation validation = (PurchasingAccountsPayableHasAccountsValidation)validations.get("PurchasingAccountsPayable-hasAccountsValidation"); validation.setItemForValidation(item); assertFalse( validation.validate(null) ); } // Tests of verifyAccountPercent public void testVerifyAccountPercent_FiftyFifty() { PurapAccountingServiceFixture fixture = PurapAccountingServiceFixture.REQ_PRORATION_TWO_ACCOUNTS; PurchasingAccountsPayableDocument doc = fixture.generateRequisitionDocument_OneItem(); List<PurApAccountingLine> purAccounts = doc.getItems().get(0).getSourceAccountingLines(); PurchaseOrderItem item = new PurchaseOrderItem(); item.setSourceAccountingLines(purAccounts); PurchasingAccountsPayableAccountPercentValidation validation = (PurchasingAccountsPayableAccountPercentValidation)validations.get("PurchasingAccountsPayable-accountPercentValidation"); validation.setItemForValidation(item); assertTrue( validation.validate(null) ); } /*public void testVerifyAccountPercent_ThreeWay() { PurapAccountingServiceFixture fixture = PurapAccountingServiceFixture.REQ_PRORATION_THIRDS; PurchasingAccountsPayableDocument doc = fixture.generateRequisitionDocument_OneItem(); List<PurApAccountingLine> purAccounts = doc.getItems().get(0).getSourceAccountingLines(); assertTrue(rules.verifyAccountPercent(doc, purAccounts, "1")); }*/ // Tests of verifyUniqueAccountingStrings public void testVerifyUniqueAccountingStrings_DifferentStrings() { List<PurApAccountingLine> purAccounts = new ArrayList<PurApAccountingLine>(); PurApAccountingLineFixture purApAcctLineFixture = PurApAccountingLineFixture.ACCOUNT_50_PERCENT; PurApAccountingLine purApAcctLine1 = purApAcctLineFixture.createPurApAccountingLine(PaymentRequestAccount.class, AccountingLineFixture.PURAP_LINE1); purAccounts.add(purApAcctLine1); PurApAccountingLine purApAcctLine2 = purApAcctLineFixture.createPurApAccountingLine(PaymentRequestAccount.class, AccountingLineFixture.PURAP_LINE2); purAccounts.add(purApAcctLine2); PurchaseOrderItem item = new PurchaseOrderItem(); item.setSourceAccountingLines(purAccounts); PurchasingAccountsPayableUniqueAccountingStringsValidation validation = (PurchasingAccountsPayableUniqueAccountingStringsValidation)validations.get("PurchasingAccountsPayable-uniqueAccountingStringsValidation"); validation.setItemForValidation(item); assertTrue( validation.validate(null) ); } public void testVerifyUniqueAccountingStrings_SameStrings() { List<PurApAccountingLine> purAccounts = new ArrayList<PurApAccountingLine>(); PurApAccountingLineFixture purApAcctLineFixture = PurApAccountingLineFixture.ACCOUNT_50_PERCENT; PurApAccountingLine purApAcctLine1 = purApAcctLineFixture.createPurApAccountingLine(PaymentRequestAccount.class, AccountingLineFixture.PURAP_LINE1); purAccounts.add(purApAcctLine1); PurApAccountingLine purApAcctLine2 = purApAcctLineFixture.createPurApAccountingLine(PaymentRequestAccount.class, AccountingLineFixture.PURAP_LINE1); purAccounts.add(purApAcctLine2); PurchaseOrderItem item = new PurchaseOrderItem(); item.setSourceAccountingLines(purAccounts); PurchasingAccountsPayableUniqueAccountingStringsValidation validation = (PurchasingAccountsPayableUniqueAccountingStringsValidation)validations.get("PurchasingAccountsPayable-uniqueAccountingStringsValidation"); validation.setItemForValidation(item); assertFalse( validation.validate(null) ); } // Tests of verifyAccountingStringsBetween0And100Percent public void testVerifyAccountingStringsBetween0And100Percent_Positive() { PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine( PurchaseOrderDocument.class, PurApAccountingLineFixture.BASIC_ACCOUNT_1, AccountingLineFixture.PURAP_LINE1); PurchasingAccountsPayableAccountPercentBetween0And100Validation validation = (PurchasingAccountsPayableAccountPercentBetween0And100Validation)validations.get("PurchasingAccountsPayable-accountPercentBetween0And100Validation-test"); validation.setAccountingLine(accountingLine); validation.setErrorPropertyName(PurapPropertyConstants.ACCOUNT_LINE_PERCENT); validation.setItemIdentifier("1"); assertTrue( validation.validate(null) ); } public void testVerifyAccountingStringsBetween0And100Percent_PercentTooHigh() { PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine( PurchaseOrderDocument.class, PurApAccountingLineFixture.BAD_ACCOUNT_PERCENT_TOO_HIGH, AccountingLineFixture.PURAP_LINE1); PurchasingAccountsPayableAccountPercentBetween0And100Validation validation = (PurchasingAccountsPayableAccountPercentBetween0And100Validation)validations.get("PurchasingAccountsPayable-accountPercentBetween0And100Validation-test"); validation.setAccountingLine(accountingLine); validation.setErrorPropertyName(PurapPropertyConstants.ACCOUNT_LINE_PERCENT); validation.setItemIdentifier("1"); assertFalse( validation.validate(null) ); } public void testVerifyAccountingStringsBetween0And100Percent_PercentZero() { PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine( PurchaseOrderDocument.class, PurApAccountingLineFixture.BAD_ACCOUNT_PERCENT_ZERO, AccountingLineFixture.PURAP_LINE1); PurchasingAccountsPayableAccountPercentBetween0And100Validation validation = (PurchasingAccountsPayableAccountPercentBetween0And100Validation)validations.get("PurchasingAccountsPayable-accountPercentBetween0And100Validation-test"); validation.setAccountingLine(accountingLine); validation.setErrorPropertyName(PurapPropertyConstants.ACCOUNT_LINE_PERCENT); validation.setItemIdentifier("1"); assertFalse( validation.validate(null) ); } public void testVerifyAccountingStringsBetween0And100Percent_PercentNegative() { PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine( PurchaseOrderDocument.class, PurApAccountingLineFixture.BAD_ACCOUNT_PERCENT_NEGATIVE, AccountingLineFixture.PURAP_LINE1); PurchasingAccountsPayableAccountPercentBetween0And100Validation validation = (PurchasingAccountsPayableAccountPercentBetween0And100Validation)validations.get("PurchasingAccountsPayable-accountPercentBetween0And100Validation-test"); validation.setAccountingLine(accountingLine); validation.setErrorPropertyName(PurapPropertyConstants.ACCOUNT_LINE_PERCENT); validation.setItemIdentifier("1"); assertFalse( validation.validate(null) ); } }