/*
* 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.khuntley;
import java.util.Map;
import org.kuali.kfs.module.purap.PurapKeyConstants;
import org.kuali.kfs.module.purap.PurapParameterConstants;
import org.kuali.kfs.module.purap.document.RequisitionDocument;
import org.kuali.kfs.module.purap.document.validation.PurapRuleTestBase;
import org.kuali.kfs.module.purap.fixture.AmountsLimitsFixture;
import org.kuali.kfs.module.purap.fixture.RequisitionDocumentFixture;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.KFSConstants;
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.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kns.datadictionary.validation.fieldlevel.PhoneNumberValidationPattern;
import org.kuali.rice.krad.exception.ValidationException;
import org.kuali.rice.krad.rules.rule.event.SaveDocumentEvent;
import org.kuali.rice.krad.util.GlobalVariables;
@ConfigureContext(session = khuntley)
public class RequisitionDocumentRuleTest extends PurapRuleTestBase {
private Map<String, GenericValidation> validations;
RequisitionDocument req;
@Override
protected void setUp() throws Exception {
super.setUp();
req = new RequisitionDocument();
validations = SpringContext.getBeansOfType(GenericValidation.class);
}
@Override
protected void tearDown() throws Exception {
validations = null;
req = null;
super.tearDown();
}
/** Additional Validations */
public void testValidateTotalDollarAmountIsLessThanPurchaseOrderTotalLimit_ZeroAmountSmallLimit() {
req = AmountsLimitsFixture.ZERO_AMOUNT_SMALL_LIMIT.populateRequisition();
RequisitionProcessAdditionalValidation validation = (RequisitionProcessAdditionalValidation)validations.get("Requisition-processAdditionalValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
}
public void testValidateTotalDollarAmountIsLessThanPurchaseOrderTotalLimit_SmallAmountSmallLimit() {
req = AmountsLimitsFixture.SMALL_AMOUNT_SMALL_LIMIT.populateRequisition();
RequisitionProcessAdditionalValidation validation = (RequisitionProcessAdditionalValidation)validations.get("Requisition-processAdditionalValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
}
public void testValidateTotalDollarAmountIsLessThanPurchaseOrderTotalLimit_LargeAmountSmallLimit() {
req = AmountsLimitsFixture.LARGE_AMOUNT_SMALL_LIMIT.populateRequisition();
RequisitionProcessAdditionalValidation validation = (RequisitionProcessAdditionalValidation)validations.get("Requisition-processAdditionalValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
}
/** End of Additional Validations */
/** Vendor Validations */
//Debarred Vendor should fail the vendor validation.
public void testProcessVendorValidation_REQ_B2B_With_Debarred_Vendor() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_B2B_WITH_DEBARRED_VENDOR.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
if (SpringContext.getBean(ParameterService.class).getParameterValueAsBoolean(KFSConstants.OptionalModuleNamespaces.PURCHASING_ACCOUNTS_PAYABLE, "Requisition", PurapParameterConstants.SHOW_DEBARRED_VENDOR_WARNING_IND)) {
assertTrue(GlobalVariables.getMessageMap().hasWarnings());
} else {
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_DEBARRED_VENDOR));
}
}
//Inactive Vendor should fail the vendor validation.
public void testProcessVendorValidation_REQ_B2B_With_Inactive_Vendor() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_B2B_WITH_INACTIVE_VENDOR.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_INACTIVE_VENDOR));
}
//Vendor Type PO is currently the valid vendor type in the system parameter. DV is not a valid type.
//TODO: We'll probably need to change this test somehow so that the valid type is obtained dynamically,
//need to figure out how to do that in the future.
public void testProcessVendorValidation_REQ_B2B_With_DV_Vendor() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_B2B_WITH_DV_VENDOR.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_INVALID_VENDOR_TYPE));
}
//Vendor Fax Number should not contain letter. It should be in ###-###-#### format.
public void testProcessVendorValidation_REQ_Invalid_Vendor_Fax_Number_Contains_Letter() {
boolean validationFailed = false;
RequisitionDocument req = RequisitionDocumentFixture.REQ_INVALID_VENDOR_FAX_NUMBER_CONTAINS_LETTER.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
try {
req.validateBusinessRules(new SaveDocumentEvent(req));
} catch (ValidationException e) {
validationFailed = true;
}
assertTrue(validationFailed);
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(new PhoneNumberValidationPattern().getValidationErrorMessageKey()));
}
//Vendor Fax Number should be in ###-###-#### format.
public void testProcessVendorValidation_REQ_Invalid_Vendor_Fax_Number_Bad_Format() {
boolean validationFailed = false;
RequisitionDocument req = RequisitionDocumentFixture.REQ_INVALID_VENDOR_FAX_NUMBER_BAD_FORMAT.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
try {
req.validateBusinessRules(new SaveDocumentEvent(req));
} catch (ValidationException e) {
validationFailed = true;
}
assertTrue(validationFailed);
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(new PhoneNumberValidationPattern().getValidationErrorMessageKey()));
}
//The vendor fax number when the value is correct (in ###-###-#### format).
public void testProcessVendorValidation_REQ_Valid_Vendor_Fax_Number() {
boolean validationFailed = false;
RequisitionDocument req = RequisitionDocumentFixture.REQ_VALID_VENDOR_FAX_NUMBER.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
try {
req.validateBusinessRules(new SaveDocumentEvent(req));
} catch (ValidationException e) {
validationFailed = true;
}
assertFalse(validationFailed);
assertTrue(GlobalVariables.getMessageMap().hasNoErrors());
}
//The vendor zip code validation should not take place if the requisition is a B2B, even if
//the zip code is actually invalid.
public void testProcessVendorValidation_REQ_B2B_WITH_INVALID_US_VENDOR_ZIP_CODE_CONTAINS_LETTER() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_B2B_WITH_INVALID_US_VENDOR_ZIP_CODE_CONTAINS_LETTER.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
}
//The vendor zip code validation should not take place if the vendor country is not US.
public void testProcessVendorValidation_REQ_WITH_INVALID_NON_US_VENDOR_ZIP_CODE_CONTAINS_LETTER() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_WITH_INVALID_NON_US_VENDOR_ZIP_CODE_CONTAINS_LETTER.createRequisitionDocument();
PurchasingProcessVendorValidation validation = (PurchasingProcessVendorValidation)validations.get("Purchasing-processVendorValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
}
/** End of Vendor Validations */
/** Payment Info Validations */
//If the begin is after the end date, it should give error.
public void testCheckBeginDateAfterEndDate() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_PO_BEGIN_DATE_AFTER_END_DATE.createRequisitionDocument();
PurchasingPaymentInfoValidation validation = (PurchasingPaymentInfoValidation)validations.get("Purchasing-paymentInfoValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_PURCHASE_ORDER_BEGIN_DATE_AFTER_END));
}
//If the begin date is not null, the end date must not be null.
public void testCheckBeginDateNoEndDate() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_PO_BEGIN_DATE_NO_END_DATE.createRequisitionDocument();
PurchasingPaymentInfoValidation validation = (PurchasingPaymentInfoValidation)validations.get("Purchasing-paymentInfoValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_PURCHASE_ORDER_BEGIN_DATE_NO_END_DATE));
}
//If the end date is not null, the begin date must not be null.
public void testCheckEndDateNoBeginDate() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_PO_END_DATE_NO_BEGIN_DATE.createRequisitionDocument();
PurchasingPaymentInfoValidation validation = (PurchasingPaymentInfoValidation)validations.get("Purchasing-paymentInfoValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_PURCHASE_ORDER_END_DATE_NO_BEGIN_DATE));
}
//If the begin and end dates are both entered, the recurring payment type must not be null.
public void testRecurringPaymentTypeNullWhenBeginAndEndDatesAreEntered() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_PO_BEGIN_DATE_AND_END_DATE_NO_RECURRING_PAYMENT_TYPE.createRequisitionDocument();
PurchasingPaymentInfoValidation validation = (PurchasingPaymentInfoValidation)validations.get("Purchasing-paymentInfoValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_RECURRING_DATE_NO_TYPE));
}
//If the recurring payment type is entered, the begin and end dates must not be null.
public void testRecurringPaymentTypeEnteredWithoutBeginNorEndDates() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_WITH_RECURRING_PAYMENT_TYPE_WITHOUT_BEGIN_NOR_END_DATE.createRequisitionDocument();
PurchasingPaymentInfoValidation validation = (PurchasingPaymentInfoValidation)validations.get("Purchasing-paymentInfoValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", req)) );
assertTrue(GlobalVariables.getMessageMap().containsMessageKey(PurapKeyConstants.ERROR_RECURRING_TYPE_NO_DATE));
}
//If the recurring payment type, begin and end dates are all entered, it should pass the validation.
public void testRecurringPaymentTypeBeginAndEndDatesEntered() {
RequisitionDocument req = RequisitionDocumentFixture.REQ_WITH_RECURRING_PAYMENT_TYPE_BEGIN_AND_END_DATE.createRequisitionDocument();
PurchasingPaymentInfoValidation validation = (PurchasingPaymentInfoValidation)validations.get("Purchasing-paymentInfoValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", req)) );
}
/** End of Payment Info Validations */
}