/*
* 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.sql.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderSensitiveData;
import org.kuali.kfs.module.purap.businessobject.SensitiveData;
import org.kuali.kfs.module.purap.businessobject.SensitiveDataAssignment;
import org.kuali.kfs.module.purap.businessobject.SensitiveDataAssignmentDetail;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.document.validation.PurapRuleTestBase;
import org.kuali.kfs.module.purap.fixture.PurchaseOrderDocumentFixture;
import org.kuali.kfs.module.purap.fixture.SensitiveDataFixture;
import org.kuali.kfs.module.purap.service.SensitiveDataService;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.validation.GenericValidation;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.document.MaintenanceDocumentBase;
import org.kuali.rice.kns.maintenance.Maintainable;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.util.GlobalVariables;
public class SensitiveDataRuleTest extends PurapRuleTestBase {
private SensitiveDataRule sensitiveDataRule;
private Map<String, GenericValidation> validations;
PurchaseOrderDocument po;
@Override
protected void setUp() throws Exception {
super.setUp();
sensitiveDataRule = new SensitiveDataRule();
validations = SpringContext.getBeansOfType(GenericValidation.class);
po = PurchaseOrderDocumentFixture.PO_ONLY_REQUIRED_FIELDS_MULTI_ITEMS.createPurchaseOrderDocument();
}
private MaintenanceDocumentBase getMaintenanceDocument(SensitiveDataFixture oldSDFixture, SensitiveDataFixture newSDFixture){
MaintenanceDocumentBase doc = null;
try {
doc = (MaintenanceDocumentBase) SpringContext.getBean(DocumentService.class).getNewDocument("PMSN");
}
catch (WorkflowException e) {
throw new RuntimeException("Document creation failed.");
}
doc.getDocumentHeader().setExplanation("JUnit test document");
Maintainable oldObj = doc.getOldMaintainableObject();
Maintainable newObj = doc.getNewMaintainableObject();
oldObj.setBusinessObject(oldSDFixture.getSensitiveDataBO());
newObj.setBusinessObject(newSDFixture.getSensitiveDataBO());
return doc;
}
@ConfigureContext(session = parke)
public final void testAssignSensitiveDataReasonEmpty() {
List<SensitiveData> sds = new ArrayList<SensitiveData>();
sds.add(SensitiveDataFixture.SENSITIVE_DATA_ACTIVE.getSensitiveDataBO());
PurchaseOrderAssignSensitiveDataValidation validation = (PurchaseOrderAssignSensitiveDataValidation)validations.get("PurchaseOrder-assignSensitiveDataValidation-test");
validation.setAccountingDocumentForValidation(po);
validation.setSensitiveDataAssignmentReason(null);
validation.setSensitiveDatasAssigned(sds);
assertFalse( validation.validate(null) );
}
@ConfigureContext(session = parke)
public final void testAssignSensitiveDataInactive() {
List<SensitiveData> sds = new ArrayList<SensitiveData>();
sds.add(SensitiveDataFixture.SENSITIVE_DATA_INACTIVE.getSensitiveDataBO());
PurchaseOrderAssignSensitiveDataValidation validation = (PurchaseOrderAssignSensitiveDataValidation)validations.get("PurchaseOrder-assignSensitiveDataValidation-test");
validation.setAccountingDocumentForValidation(po);
validation.setSensitiveDatasAssigned(sds);
assertFalse( validation.validate(null) );
}
@ConfigureContext(session = parke)
public final void testAssignSensitiveDataIDuplicate() {
List<SensitiveData> sds = new ArrayList<SensitiveData>();
sds.add(SensitiveDataFixture.SENSITIVE_DATA_ACTIVE.getSensitiveDataBO());
sds.add(SensitiveDataFixture.SENSITIVE_DATA_ACTIVE.getSensitiveDataBO());
PurchaseOrderAssignSensitiveDataValidation validation = (PurchaseOrderAssignSensitiveDataValidation)validations.get("PurchaseOrder-assignSensitiveDataValidation-test");
validation.setAccountingDocumentForValidation(po);
validation.setSensitiveDatasAssigned(sds);
assertFalse( validation.validate(null) );
}
/**
* This test combines the test for SensitiveDataService and SensitiveDataRule on InactivationBlocking
* since the latter involves all major operations provided by the service class.
*/
@ConfigureContext(session = parke)
public final void testSensitiveDataInactivationBlocking() {
// create a new sensitive data entry and save it (if not exists yet) for this test
BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class);
SensitiveData sdNew = SensitiveDataFixture.SENSITIVE_DATA_TO_INACTIVATE.getSensitiveDataBO();
if (boService.retrieve(sdNew) == null) {
boService.save(sdNew);
}
// add an active sensitive data entry for the PO, update all 3 tables to keep consistency
List<SensitiveData> sds = new ArrayList<SensitiveData>();
sds.add(sdNew);
SensitiveDataService sdService = SpringContext.getBean(SensitiveDataService.class);
Integer poId = po.getPurapDocumentIdentifier();
if (poId == null) {
poId = new Integer(1000);
}
// update table SensitiveDataAssignment
Date currentDate = SpringContext.getBean(DateTimeService.class).getCurrentSqlDate();
SensitiveDataAssignment sda = new SensitiveDataAssignment();
sda.setPurapDocumentIdentifier(poId);
sda.setSensitiveDataAssignmentReasonText("test");
sda.setSensitiveDataAssignmentChangeDate(currentDate);
sda.setSensitiveDataAssignmentPersonIdentifier("parke");
sdService.saveSensitiveDataAssignment(sda);
// update table SensitiveDataAssignmentDetail
Integer sdaId = sdService.getLastSensitiveDataAssignmentId(poId);
List<SensitiveDataAssignmentDetail> sdads = new ArrayList<SensitiveDataAssignmentDetail>();
for (SensitiveData sd : sds) {
SensitiveDataAssignmentDetail sdad = new SensitiveDataAssignmentDetail();
sdad.setSensitiveDataAssignmentIdentifier(sdaId);
sdad.setSensitiveDataCode(sd.getSensitiveDataCode());
sdads.add(sdad);
}
sdService.saveSensitiveDataAssignmentDetails(sdads);
// update table PurchaseOrderSensitiveData
sdService.deletePurchaseOrderSensitiveDatas(poId);
List<PurchaseOrderSensitiveData> posds = new ArrayList<PurchaseOrderSensitiveData>();
for (SensitiveData sd : sds) {
PurchaseOrderSensitiveData posd = new PurchaseOrderSensitiveData();
posd.setPurapDocumentIdentifier(poId);
posd.setRequisitionIdentifier(po.getRequisitionIdentifier());
posd.setSensitiveDataCode(sd.getSensitiveDataCode());
posds.add(posd);
}
sdService.deletePurchaseOrderSensitiveDatas(poId);
sdService.savePurchaseOrderSensitiveDatas(posds);
// try to inactivate the sensitive data just assigned to the PO, should fail rule
GlobalVariables.getUserSession().setBackdoorUser("khuntley");
MaintenanceDocumentBase maintDoc = getMaintenanceDocument(SensitiveDataFixture.SENSITIVE_DATA_TO_INACTIVATE, SensitiveDataFixture.SENSITIVE_DATA_INACTIVATED);
sensitiveDataRule.setupBaseConvenienceObjects(maintDoc);
assertFalse(sensitiveDataRule.processCustomRouteDocumentBusinessRules(maintDoc));
assertFalse(sensitiveDataRule.processCustomApproveDocumentBusinessRules(maintDoc));
GlobalVariables.getUserSession().clearBackdoorUser();
}
}