/* * 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.sys.batch.service; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.RandomUtils; import org.kuali.kfs.fp.batch.ProcurementCardInputFileType; import org.kuali.kfs.gl.batch.CollectorBatch; import org.kuali.kfs.gl.batch.CollectorXmlInputFileType; import org.kuali.kfs.gl.batch.MockCollectorBatch; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.KualiTestConstants.TestConstants.Data4; import org.kuali.kfs.sys.batch.BatchInputFileType; import org.kuali.kfs.sys.context.KualiTestBase; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.exception.FileStorageException; import org.kuali.rice.kim.api.identity.Person; import org.kuali.rice.krad.exception.AuthorizationException; /** * Tests the BatchInputFileService. TEST DEPENDENCIES The following are external configurations not setup by the test case that are * necessary for the test to run correctly: 1) User identified by the constant Data4_USER_ID2 must be a member of the workgroup * given by constant Data2.FP_OPERATIONS. 2) User identified by the constant Data4_USER_ID1 must NOT be a member of the workgroup * given by constant Data2.FP_OPERATIONS. 3) Five xml files must exist in the PCDO staging directory. Name of files is not important. * 4) One Collector files must exist in Collector staging directory. File name should not contain the usernames given by constants * Data4_USER_ID2 and Data4_USER_ID1. Note the files in #3 & #4 are created by the project build from files located in project * folder buld/configurationFiles/externalConfigDirectory/static/staging/ * * @see org.kuali.kfs.sys.batch.service.BatchInputFileService Unit tests for this service are also in: * @see org.kuali.kfs.sys.batch.service.BatchInputServiceParseTest * @see org.kuali.kfs.sys.batch.service.BatchInputServiceSystemParametersTest */ @ConfigureContext public class BatchInputFileServiceTest extends KualiTestBase { private static final String TEST_BATCH_XML_DIRECTORY = "org/kuali/kfs/sys/batch/fixture/"; private BatchInputFileService batchInputFileService; private String testFileIdentifier; private InputStream validPCDOFileContents; private InputStream validCollectorFileContents; private InputStream validSampleFileContents; private BatchInputFileType pcdoBatchInputFileType; private BatchInputFileType collectorBatchInputFileType; private BatchInputFileType sampleBatchInputFileType; private Person validWorkgroupUser; private Person invalidWorkgroupUser; private List<File> createdTestFiles; /** * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); batchInputFileService = SpringContext.getBean(BatchInputFileService.class); pcdoBatchInputFileType = SpringContext.getBean(ProcurementCardInputFileType.class); collectorBatchInputFileType = SpringContext.getBean(CollectorXmlInputFileType.class); sampleBatchInputFileType = SpringContext.getBean(BatchInputFileType.class,"sampleTest2FlatFileInputFileType"); testFileIdentifier = "junit" + RandomUtils.nextInt(); validPCDOFileContents = BatchInputFileServiceTest.class.getClassLoader().getResourceAsStream(TEST_BATCH_XML_DIRECTORY + "BatchInputValidPCDO.xml"); validCollectorFileContents = BatchInputFileServiceTest.class.getClassLoader().getResourceAsStream(TEST_BATCH_XML_DIRECTORY + "BatchInputValidCollector.xml"); validSampleFileContents = BatchInputFileServiceTest.class.getClassLoader().getResourceAsStream(TEST_BATCH_XML_DIRECTORY + "BatchInputFileWithNoExtension"); validWorkgroupUser = SpringContext.getBean(org.kuali.rice.kim.api.identity.PersonService.class).getPersonByPrincipalName(Data4.USER_ID2); invalidWorkgroupUser = SpringContext.getBean(org.kuali.rice.kim.api.identity.PersonService.class).getPersonByPrincipalName(Data4.USER_ID1); createdTestFiles = new ArrayList(); } /** * Clean up any files created during test methods that were not removed (possibly because of a failure). * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (createdTestFiles != null) { for (File createdFile : createdTestFiles) { if (createdFile.exists()) { createdFile.delete(); } String doneFileName = StringUtils.substringBeforeLast(createdFile.getPath(), ".") + ".done"; File doneFile = new File(doneFileName); if (doneFile.exists()) { doneFile.delete(); } } } } /** * Checks file was created succesfully for valid call to save method. */ public final void testSave_valid() throws Exception { String savedFileName = batchInputFileService.save(validWorkgroupUser, pcdoBatchInputFileType, testFileIdentifier, validSampleFileContents, new ArrayList()); File expectedFile = new File(savedFileName); createdTestFiles.add(expectedFile); assertTrue("uploaded pcdo file not found", expectedFile.exists()); assertTrue("uploaded pcdo file is empty", expectedFile.length() > 0); checkForDoneFile(expectedFile); // remove file so we can test collector upload expectedFile.delete(); List<CollectorBatch> batch = new ArrayList<CollectorBatch>(); batch.add(new MockCollectorBatch()); savedFileName = batchInputFileService.save(validWorkgroupUser, collectorBatchInputFileType, testFileIdentifier, validCollectorFileContents, batch); expectedFile = new File(savedFileName); createdTestFiles.add(expectedFile); assertTrue("uploaded collector file not found", expectedFile.exists()); assertTrue("uploaded collector file is empty", expectedFile.length() > 0); checkForDoneFile(expectedFile); } public final void testSaveFileWithNoExtension() throws Exception { String savedFileName = batchInputFileService.save(validWorkgroupUser, sampleBatchInputFileType , testFileIdentifier, validPCDOFileContents, new ArrayList()); File expectedFile = new File(savedFileName); createdTestFiles.add(expectedFile); assertTrue("uploaded sample file with no extension not found", expectedFile.exists()); checkForDoneFile(expectedFile); // remove file expectedFile.delete(); } /** * Checks for a done file with the same name as the given batch file. */ private final void checkForDoneFile(File batchFile) { String doneFileName = StringUtils.substringBeforeLast(batchFile.getPath(), ".") + ".done"; File doneFile = new File(doneFileName); assertTrue("done file " + doneFile.getPath() + " does not exist", doneFile.exists()); } /** * Assures AuthorizationException is being thrown when the user does not have permissions on the given batch input type. */ public final void DISABLED_testSave_incorrectUserPermissions() throws Exception { boolean failedAsExpected = false; try { batchInputFileService.save(invalidWorkgroupUser, pcdoBatchInputFileType, testFileIdentifier, validPCDOFileContents, new ArrayList()); } catch (AuthorizationException e) { failedAsExpected = true; } assertTrue("authorization exception not thrown for user with invalid permissions on pcdo batch type", failedAsExpected); failedAsExpected = false; try { batchInputFileService.save(invalidWorkgroupUser, collectorBatchInputFileType, testFileIdentifier, validCollectorFileContents, new MockCollectorBatch()); } catch (AuthorizationException e) { failedAsExpected = true; } assertTrue("authorization exception not thrown for user with invalid permissions on collector batch type", failedAsExpected); } /** * Assures FileStorageException is thrown when a the requested file name is already used by another file on the server. */ public final void DISABLED_testSave_saveFileNameExists() throws Exception { String savedFileName = batchInputFileService.save(validWorkgroupUser, pcdoBatchInputFileType, testFileIdentifier, validPCDOFileContents, new ArrayList()); File expectedFile = new File(savedFileName); createdTestFiles.add(expectedFile); // assure first attempt was completed successfully assertTrue("uploaded pcdo file not found", expectedFile.exists()); long lastModifiedTime = expectedFile.lastModified(); // no attemp to a file with the same name boolean failedAsExpected = false; try { batchInputFileService.save(validWorkgroupUser, pcdoBatchInputFileType, testFileIdentifier, validPCDOFileContents, new ArrayList()); } catch (FileStorageException e) { failedAsExpected = true; } assertTrue("exception not thrown for attempt to save a file with existing name", failedAsExpected); assertEquals("file was modified even though storage exception was thrown", lastModifiedTime, expectedFile.lastModified()); } }