@Override
 protected void setUp() throws Exception {
   super.setUp();
   validation = new TravelDocumentActualExpenseLineValidation();
   dateTimeService = SpringContext.getBean(DateTimeService.class);
   docService = SpringContext.getBean(DocumentService.class);
   dictionaryValidationService = SpringContext.getBean(DictionaryValidationService.class);
   validation.setDictionaryValidationService(dictionaryValidationService);
 }
  @Test
  public void testValidateGeneralRules() {

    TravelReimbursementDocument document = new TravelReimbursementDocument();
    List<ActualExpense> actualExpenses = new ArrayList<ActualExpense>();
    ActualExpense airFareEntry = new ActualExpense();
    ActualExpense mileageEntry = new ActualExpense();
    ExpenseTypeObjectCode aTravelExpenseTypeCode = new ExpenseTypeObjectCode();

    document.setActualExpenses(actualExpenses);

    aTravelExpenseTypeCode.setExpenseTypeCode(AIRFARE_EXPENSE_TYPE_CODE);

    // Testing expense amount required validation since expense type is not mileage
    airFareEntry.setTravelExpenseTypeCode(aTravelExpenseTypeCode);
    airFareEntry.setExpenseDate(dateTimeService.getCurrentSqlDate());
    airFareEntry.setExpenseTypeCode(AIRFARE_EXPENSE_TYPE_CODE);
    assertTrue(validation.validateGeneralRules(airFareEntry, document));

    // Testing expense amount required validation since expense type is not mileage
    airFareEntry.setExpenseAmount(new KualiDecimal(-100));
    assertFalse(validation.validateGeneralRules(airFareEntry, document));

    // Testing Currency rate required validation
    airFareEntry.setExpenseAmount(new KualiDecimal(100));
    airFareEntry.setCurrencyRate(BigDecimal.ZERO);
    assertTrue(validation.validateGeneralRules(airFareEntry, document));

    // Testing duplicate entry
    ActualExpense duplicateAirfareEntry = new ActualExpense();
    duplicateAirfareEntry.setTravelExpenseTypeCode(aTravelExpenseTypeCode);
    duplicateAirfareEntry.setExpenseTypeCode(AIRFARE_EXPENSE_TYPE_CODE);
    duplicateAirfareEntry.setExpenseAmount(new KualiDecimal(100.00));
    duplicateAirfareEntry.setExpenseDate(dateTimeService.getCurrentSqlDate());
    actualExpenses.add(airFareEntry);
    assertFalse(validation.validateGeneralRules(duplicateAirfareEntry, document));

    // Testing expense amount not required validation when expense type is mileage
    ExpenseTypeObjectCode mTravelExpenseTypeCode = new ExpenseTypeObjectCode();
    mTravelExpenseTypeCode.setExpenseTypeCode(MILEAGE_EXPENSE_TYPE_CODE);
    mileageEntry.setExpenseAmount(KualiDecimal.ZERO);
    mileageEntry.setTravelExpenseTypeCode(mTravelExpenseTypeCode);
    assertTrue(validation.validateGeneralRules(mileageEntry, document));
  }
  /** This method tests validate method */
  @Test
  public void testValidation() {
    TravelReimbursementDocument tr = null;
    try {
      tr =
          (TravelReimbursementDocument)
              docService.getNewDocument(TravelReimbursementDocument.class);
    } catch (WorkflowException e) {
      throw new RuntimeException(e);
    }

    ActualExpense ote2 = new ActualExpense();

    ote2.setExpenseAmount(new KualiDecimal(EXPENSE_AMOUNT));
    ote2.setExpenseDate(dateTimeService.getCurrentSqlDate());
    ote2.setExpenseTypeCode(AIRFARE_EXPENSE_TYPE_CODE);
    // tr.addActualExpense(ote2);

    AddActualExpenseLineEvent event2 = new AddActualExpenseLineEvent("errorPathPrefix", tr, ote2);
    validation.setActualExpenseForValidation(ote2);
    assertTrue(validation.validate(event2));
  }