org.kuali.kfs.module.ld.batch.service.LaborScrubberServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.kfs.module.ld.batch.service.LaborScrubberServiceTest.java

Source

/*
 * 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.ld.batch.service;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.gl.businessobject.OriginEntryFull;
import org.kuali.kfs.module.ld.LaborConstants;
import org.kuali.kfs.module.ld.batch.LaborScrubberStep;
import org.kuali.kfs.module.ld.businessobject.LaborOriginEntry;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.Message;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.context.TestUtils;

@ConfigureContext
public class LaborScrubberServiceTest extends LaborOriginEntryTestBase {
    private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborScrubberServiceTest.class);

    private LaborScrubberService laborScrubberService = null;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        laborScrubberService = SpringContext.getBean(LaborScrubberService.class);
        laborScrubberService.setDateTimeService(dateTimeService);

        dateTimeService.setCurrentDate(new java.util.Date());
    }

    public void testDemerger() throws Exception {
        String[] inputTransactions = {
                "2026BA6044900-----2400---ACEX06BT  PLM01010207     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50D2008-12-22                                                 2008-12-222008-12-31000168.002007060000149952 001REGS12PAE 11 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50C2008-12-22                                                 2008-12-222008-12-31000168.002007060000149952 001REGS12PAE 11 M001010207                     IU IUBLA",
                "2026BA6044900-----2400---ACEX06ST  PLM01010207     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50C2008-12-22                                                 2008-12-222008-12-31000168.002007060000149952 001REGS12PAE 11 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06ST  PLM01010207     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50C2008-12-22                                                 2008-12-222008-12-31000168.002007060000149952 001REGS12PAE 11 M001010207                     IU IUBLA" };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[2]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[3]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[2]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[3]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testValidEntries() throws Exception {
        String[] inputTransactions = {
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50D2008-12-22                                                 2008-12-222008-12-31000168.002009060000149952 001REGS12PAE 11 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000200014789----------KUALI TEST DESCRIPTION                  +00000000000003329.27D2008-12-22                                                 2008-12-222008-12-31000082.322009060000649044 000REGS12PAE 16 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000300015213----------KUALI TEST DESCRIPTION                  +00000000000002716.89D2008-12-22                                                 2008-12-222008-12-31000084.862009060000683206 000REGS12PAE 13 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000400017659----------KUALI TEST DESCRIPTION                  +00000000000001620.08D2008-12-22                                                 2008-12-222008-12-31000041.382009060001316908 000REGS12PAE 13 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000500019196----------KUALI TEST DESCRIPTION                  +00000000000005106.15D2008-12-22                                                 2008-12-222008-12-31000104.932009060001368813 000REGS12PAE 19 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000600022120----------KUALI TEST DESCRIPTION                  +00000000000003071.10D2008-12-22                                                 2008-12-222008-12-31000106.752009060001773996 000REGS12PAE 12 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX07BT  PLM04013107     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50D2009-01-25                                                 2009-01-252009-01-31000184.002009070000149952 001REGS12PAE 11 M004013107                     IU IUBLA",
                "2009BA6044900-----2400---ACEX07BT  PLM04013107     0000200014789----------KUALI TEST DESCRIPTION                  +00000000000003329.27D2009-01-25                                                 2009-01-252009-01-31000090.162009070000649044 000REGS12PAE 16 M004013107                     IU IUBLA",
                "2009BA6044900-----2400---ACEX07BT  PLM04013107     0000300015213----------KUALI TEST DESCRIPTION                  +00000000000002716.89D2009-01-25                                                 2009-01-252009-01-31000092.942009070000683206 000REGS12PAE 13 M004013107                     IU IUBLA",
                "2009BA6044900-----2400---ACEX07BT  PLM04013107     0000400017659----------KUALI TEST DESCRIPTION                  +00000000000001620.08D2009-01-25                                                 2009-01-252009-01-31000045.322009070001316908 000REGS12PAE 13 M004013107                     IU IUBLA" };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[2]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[3]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[4]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[5]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[6]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[7]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[8]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[9]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[2]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[3]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[4]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[5]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[6]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[7]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[8]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[9]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testBlankFiscalYear() throws Exception {
        String[] inputTransactions = {
                "    BA6044900-----2400---ACEX06BT  PLBLANKFISC     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50D2008-12-22                                                 2008-12-222008-12-31000168.002009060000149952 001REGS12PAE 11 M001010207                     IU IUBLA" };

        String expectedOutput = this.testingYear + StringUtils.substring(inputTransactions[0], 4, 29)
                + this.testingPeriodCode + StringUtils.substring(inputTransactions[0], 31);
        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testInvalidObjectCode() throws Exception {
        String[] inputTransactions = {
                "2000BA6044906-----2400---ACEX06BT  PLCLOSEFISC     0000300015213----------KUALI TEST DESCRIPTION                  +00000000000002716.89D2006-12-22                                                 2006-12-222006-12-31000084.862007060000683206 000REGS12PAE 13 M001010207                     IU IUBLA",
                "2000BA6044906-----2400---ACEX06BT  PLCLOSEFISC     0000400017659----------KUALI TEST DESCRIPTION                  +00000000000001620.08D2006-12-22                                                 2006-12-222006-12-31000041.382007060001316908 000REGS12PAE 13 M001010207                     IU IUBLA" };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[1]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);

    }

    public void testInvalidFiscalYear() throws Exception {
        String[] inputTransactions = {
                "2026BA6044913-----2400---ACEX06BT  PLINVALFISC     0000500019196----------KUALI TEST DESCRIPTION                  +00000000000005106.15D2006-12-22                                                 2006-12-222006-12-31000104.932007060001368813 000REGS12PAE 19 M001010207                     IU IUBLA",
                "2026BA6044913-----2400---ACEX06BT  PLINVALFISC     0000600022120----------KUALI TEST DESCRIPTION                  +00000000000003071.10D2006-12-22                                                 2006-12-222006-12-31000106.752007060001773996 000REGS12PAE 12 M001010207                     IU IUBLA" };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[1]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testInvalid() throws Exception {
        String[] inputTransactions = {
                "2009  1031400-----2400---ACEX07BT  PLBLANKCHAR     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50D2009-01-25                                                 2009-01-252009-01-31000184.002009070000149952 001REGS12PAE 11 M004013107                     IU IUBLA",
                "2009  1031400-----2400---ACEX07BT  PLBLANKCHAR     0000200014789----------KUALI TEST DESCRIPTION                  +00000000000003329.27D2009-01-25                                                 2009-01-252009-01-31000090.162009070000649044 000REGS12PAE 16 M004013107                     IU IUBLA" };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[1]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testInvalidDebitCreditCode() throws Exception {
        String[] inputTransactions = {
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003493.50X2008-12-22                                                 2008-12-222008-12-31000168.002009060000149952 001REGS12PAE 11 M001010207                     IU IUBLA",
                "2009BA6044900-----2400---ACEX06BT  PLM01010207     0000100009529----------KUALI TEST DESCRIPTION                  +00000000000003495.50X2008-12-25                                                 2008-12-222008-12-31000168.002009060000149952 001REGS12PAE 11 M001010207                     IU IUBLA" };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[1]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testA2balanceTypeAcceptClosedFiscalPeriod() throws Exception {
        String[] inputTransactions = {
                "2008BL1031400-----5772---A2EX06ST  PLPRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[0]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testValidateAccountWithAllParametersOff() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "N");

        String[] inputTransactions = {
                "2008BL2131401-----5772---ACEX08ST  PLPRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE,
                        inputTransactions[0]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    // All parameters are off, except a parameter for continuation account.
    // Test with closed account and special origination code that has override ability
    public void testInvalidateAccountWithOnlyContinuationAccountOn() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "N");

        String[] inputTransactions = {
                "2008BL2131401-----5772---ACEX08ST  PLPRENC-07      00002MTFRING ----------AUTO FR BL2631476KUALI TEST DESCRIPTION +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE,
                        inputTransactions[0]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    // All parameters are off, except a parameter for continuation account. Test with closed account.
    public void testValidateAccountWithOnlyContinuationAccountOn() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "N");

        // This entry is expired or closed. This entry will be saved in LSCV.
        String[] inputTransactions = {
                "2008BL2131401-----5772---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        String expectedOutput = "2008BL2331489-----5772---ACEX08ST  99PRENC-07      00002MTFRING ----------AUTO FR BL2131401KUALI TEST DESCRIPTION +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             ";
        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE, expectedOutput) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testNotSubfundWageExclusion() throws Exception {

        TestUtils tu = new TestUtils();

        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "Y");
        // This entry is expired or closed, but it won't use alternative continuation account
        // because there is no Expiration Date.
        // This entry accepts sunfundwage, so will not run subfundWageExclusion logic.
        // This entry will not run accountFringeExclusion logic.
        // This entry will be saved in LSCX and LSCV.

        String[] inputTransactions = {
                "2008BL2131401-----5772---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        String expectedOutput = "2008BL2331489-----5772---ACEX08ST  99PRENC-07      00002MTFRING ----------AUTO FR BL2131401KUALI TEST DESCRIPTION +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             ";
        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE, expectedOutput) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testSubfundWageExclusion() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "Y");

        // This entry is expired or closed.
        // This entry doensn't accept sunfundwage, so will run subfundWageExclusion logic and use suspense account.
        // This entry will be saved in LSCX and LSCV.

        String[] inputTransactions = {
                "2008EA6867070-----5772---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        String expectedOutput = "2008UA6812756-----5772---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             ";
        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE, expectedOutput) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testSubfundWageExclusionWithSubfundParameterOff() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "Y");

        // This entry is expired or closed.
        // This account doesn't have closed indicator, so continuation account logic won't run and it is stored only in LSCV.
        // This entry not accept sunfundwage, but the parameter is off, so subfundWageExclusion logic won't run.

        String[] inputTransactions = {
                "2008UA6812756-----5772---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[0]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    /**
     * Test non-fringe, non-alt, non-closed
     * @throws Exception
     */
    public void testNonFringeNonAltNonClosed() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "Y");

        // This entry is expired or closed, but, this account doesn't have closed indicator, so it is stored in LSCV.
        // This entry accept sunfundwage, and not accept Fringe
        // Chart code: BL, Object code: 5760, Fiscal Year: 2008
        // It doesn't have alternative fringe account, so it uses suspense account.
        // This entry will be changed   2008UA6812756-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                             28988.60C2008-12-14                                                 2008-12-14          0        200906-----------0               M037113006
        //      "2008BL2631476-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +0000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             "

        // Test entries provided by Damon Dorsey on 5/10/11
        String[] inputTransactions = {
                "2011UA6812757-----2000---ACEX06ST  LDNOWAGE1            00000001----------NO WAGE ACCOUNT                         +00000000000001000.00D2011-09-01                                                 2011-10-232011-08-090000000102011010001537923 01 RGNS12",
                "2011UA6812757-----5625---ACEX06ST  LDNOWAGE2            00000001----------NO WAGE ACCOUNT                         +00000000000000125.00D2011-09-01                                                 2011-10-232011-08-090000000102011010001537923 01 RGNS12",
                "2011EA0366595-----5625---ACEX06ST  LDNOFRINGE2          00000001----------NO FRINGE ACCOUNT                       +00000000000003500.00D2011-09-01                                                 2011-10-232011-08-090000000102011010001537923 01 RGNS12" };

        String[] expectedOutput = {
                "2011UA6812756-----2000---ACEX06ST  LDNOWAGE1       0000000000001----------NO WAGE ACCOUNT                         +00000000000001000.00D2011-09-01                                                 2011-10-232011-08-09       102011010001537923   1RGNS12",
                "2011UA6812756-----5625---ACEX06ST  LDNOWAGE2       0000000000001----------NO WAGE ACCOUNT                         +00000000000000125.00D2011-09-01                                                 2011-10-232011-08-09       102011010001537923   1RGNS12",
                "2011UA6612160-----5625---ACEX06ST  LDNOFRINGE2     0000000000001----------NO FRINGE ACCOUNT                       +00000000000003500.00D2011-09-01                                                 2011-10-232011-08-09       102011010001537923   1RGNS12"

                //                "2011UA6812757-----2000---ACEX  ST  LDNOWAGE1            00000001----------NO WAGE ACCOUNT                         +00000000000001000.00D2011-09-01                                                 2011-10-232011-08-090000000102011010001537923 01 RGNS12",
                //                "2011UA6812757-----5625---ACEX  ST  LDNOWAGE2            00000001----------NO WAGE ACCOUNT                         +00000000000000125.00D2011-09-01                                                 2011-10-232011-08-090000000102011010001537923 01 RGNS12",
                //                "2011UA6612160-----5625---ACEX11ST  LDNOFRINGE2     0000000000001----------NO FRINGE ACCOUNT                       +00000000000003500.00D2011-09-01                                                 2011-10-232011-08-09       102011010001537923   1RGNS12"
        };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[2]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput[1]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput[2]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    // TODO: the tested account has an continuation account, so the suspense account logic cannot be reached
    public void testNonFringeNonAltNonClosedIndicatorWithSuspenseParameterOff() throws Exception {
        /*TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class, LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class, LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class, LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class, LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "N");
            
        // This entry is expired or closed, but, this account doesn't have closed indicator, so it is stored in LSCV.
        // This entry accept sunfundwage, and not accept Fringe Chart code: BL, Object code: 5760, Fiscal Year: 2008
        // It doesn't have alternative fringe account, so it uses suspense account.
        // But, since the parameter for suspense account indicator is off, this entry will be saved in LSCE.
            
        String[] inputTransactions = {
            "2008BL2631476-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +0000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             "
        };
            
        EntryHolder[] outputTransactions = {
            new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
            new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_ERROR_OUTPUT_FILE, inputTransactions[0])
        };
            
        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions); */
    }

    public void testNonFringeNonAltNonClosedIndicatorWithFringeParameterOff() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "Y");

        String[] inputTransactions = {
                "2008BL2631476-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        String expectedOutput = "2008BL2331489-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------AUTO FR BL2631476KUALI TEST DESCRIPTION +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             ";
        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE, expectedOutput),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);

    }

    public void testClosedAccountWithAllParemetersOff() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "N");

        String[] inputTransactions = {
                "2008EA6867070-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE,
                        inputTransactions[0]) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    public void testClosedAccountWithAllParemetersOffOnlyContinuationOn() throws Exception {
        TestUtils tu = new TestUtils();
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUBFUND_WAGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.ACCOUNT_FRINGE_EXCLUSION_PARAMETER, "N");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.CONTINUATION_ACCOUNT_LOGIC_PARAMETER, "Y");
        TestUtils.setSystemParameter(LaborScrubberStep.class,
                LaborConstants.Scrubber.SUSPENSE_ACCOUNT_LOGIC_PARAMETER, "N");

        String[] inputTransactions = {
                "2008EA6867070-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------KUALI TEST DESCRIPTION                  +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             " };

        String expectedOutput = "2008EA9567000-----5760---ACEX08ST  99PRENC-07      00002MTFRING ----------AUTO FR EA6867070KUALI TEST DESCRIPTION +00000000000028988.60C2008-12-14                                                D2008-12-14          000000.00200906-----------000             M037113006                             ";
        EntryHolder[] outputTransactions = {
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions[0]),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_VALID_OUTPUT_FILE, expectedOutput),
                new EntryHolder(LaborConstants.BatchFileSystem.SCRUBBER_EXPIRED_OUTPUT_FILE, expectedOutput) };

        scrub(inputTransactions);
        assertOriginEntries(4, outputTransactions);
    }

    /**
     * Loads an array of String-formatted entries into the database, and then runs the scrubber on those entries
     *
     * @param inputTransactions an array of String-formatted entries to scrub
     */
    private void scrub(String[] inputTransactions) {
        clearBatchFiles();

        int count = 1;
        for (String transaction : inputTransactions) {
            OriginEntryFull entry = new LaborOriginEntry();
            List<Message> messages = entry.setFromTextFileForBatch(transaction, count);
            if (messages.size() > 0) {
                LOG.warn("Transaction " + transaction + "could not be parsed correctly");
                for (Message message : messages) {
                    LOG.warn(message.getMessage());
                }
            }
            count += 1;
        }

        loadInputTransactions(LaborConstants.BatchFileSystem.SCRUBBER_INPUT_FILE, inputTransactions);
        laborScrubberService.scrubEntries();
    }

}