@Test
  public void shouldAllowPeriodicFeeForNonVariableInstallmentLoanProduct() {
    String PERIODIC_FEE_2 = "2";
    String NON_PERIODIC_FEE = "3";

    final FeeDto feeDto = Mockito.mock(FeeDto.class);
    loanPrdActionForm =
        new LoanPrdActionForm() {
          @Override
          FeeDto getFeeDto(
              @SuppressWarnings("unused") HttpServletRequest request,
              @SuppressWarnings("unused") FeeBO fee) {
            return feeDto;
          }
        };

    FeeFrequencyEntity feeFrequencyEntity = Mockito.mock(FeeFrequencyEntity.class);
    MeetingBO meetingBo = Mockito.mock(MeetingBO.class);
    MeetingDetailsEntity meetingDetailsEntity = Mockito.mock(MeetingDetailsEntity.class);

    when(periodicFeeRate.isPeriodic()).thenReturn(true);
    when(periodicFeeRate.getFeeType()).thenReturn(RateAmountFlag.RATE);
    when(periodicFeeRate.getFeeId()).thenReturn(Short.valueOf(PERIODIC_FEE_2));
    when(periodicFeeRate.getFeeName()).thenReturn("periodic fee2");
    when((periodicFeeRate).getFeeFormula()).thenReturn(feeFormulaEntity);
    when(feeFormulaEntity.getFeeFormula()).thenReturn(FeeFormula.INTEREST);
    when(periodicFeeRate.getFeeFrequency()).thenReturn(feeFrequencyEntity);

    when(nonPeriodicFeeRate.isPeriodic()).thenReturn(false);
    when(nonPeriodicFeeRate.getFeeType()).thenReturn(RateAmountFlag.RATE);
    when(nonPeriodicFeeRate.getFeeId()).thenReturn(Short.valueOf(NON_PERIODIC_FEE));
    when(nonPeriodicFeeRate.getFeeName()).thenReturn("non Periodic fee");
    when(((RateFeeBO) nonPeriodicFeeRate).getFeeFormula()).thenReturn(feeFormulaEntity);
    when(feeFormulaEntity.getFeeFormula()).thenReturn(FeeFormula.INTEREST);

    List<FeeBO> allPrdFees = new ArrayList<FeeBO>();
    allPrdFees.add(periodicFeeRate);
    allPrdFees.add(nonPeriodicFeeRate);

    when(request.getAttribute(Constants.CURRENTFLOWKEY)).thenReturn(FLOW_KEY);
    when(request.getSession()).thenReturn(session);
    when(session.getAttribute(Constants.FLOWMANAGER)).thenReturn(flowManager);
    when(session.getAttribute(ProductDefinitionConstants.LOANPRDFEE)).thenReturn(allPrdFees);

    Flow flow = new Flow();
    try {
      when(flowManager.getFromFlow(Mockito.anyString(), Mockito.anyString()))
          .thenReturn(allPrdFees);
      when(flowManager.getFlowWithValidation(FLOW_KEY)).thenReturn(flow);
    } catch (PageExpiredException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    loanPrdActionForm.setCanConfigureVariableInstallments(false);
    loanPrdActionForm.setPrdOfferinFees(new String[] {PERIODIC_FEE_2, NON_PERIODIC_FEE});

    loanPrdActionForm.validateSelectedFeeForVariableInstallment(request, errors);
    Mockito.verifyZeroInteractions(errors);
  }
  public void testSuccessfulUpdate_RateFee() throws Exception {
    fee =
        TestObjectFactory.createOneTimeRateFee(
            "One Time Fee", FeeCategory.ALLCUSTOMERS, 24.0, FeeFormula.AMOUNT, FeePayment.UPFRONT);
    request.setAttribute(Constants.CURRENTFLOWKEY, flowKey);
    SessionUtils.setAttribute(Constants.BUSINESS_KEY, fee, request);
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "manage");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();

    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "editPreview");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    addRequestParameter("rate", "30");
    actionPerform();

    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "update");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();
    verifyNoActionErrors();
    verifyForward(ActionForwards.update_success.toString());

    fee = (FeeBO) TestObjectFactory.getObject(FeeBO.class, fee.getFeeId());
    Assert.assertTrue(fee.isActive());
    Assert.assertEquals(30.0, ((RateFeeBO) fee).getRate(), DELTA);
  }
  public void testSuccessfulUpdate_AmountFee() throws Exception {
    fee =
        TestObjectFactory.createOneTimeAmountFee(
            "One Time Fee", FeeCategory.ALLCUSTOMERS, "100", FeePayment.UPFRONT);
    request.setAttribute(Constants.CURRENTFLOWKEY, flowKey);
    SessionUtils.setAttribute(Constants.BUSINESS_KEY, fee, request);
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "manage");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();

    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "editPreview");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    addRequestParameter("amount", "200.0");
    addRequestParameter("feeStatus", FeeStatus.INACTIVE.getValue().toString());
    actionPerform();

    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "update");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();
    verifyNoActionErrors();
    verifyForward(ActionForwards.update_success.toString());

    fee = (FeeBO) TestObjectFactory.getObject(FeeBO.class, fee.getFeeId());
    Assert.assertFalse(fee.isActive());
    Assert.assertEquals(new Money(getCurrency(), "200.0"), ((AmountFeeBO) fee).getFeeAmount());
  }
  @Test
  public void shouldNotAllowPeriodicFeeForVariableInstallmentLoanProduct() {
    String PERIODIC_FEE_2 = "2";
    String NON_PERIODIC_FEE = "3";

    when(periodicFeeRate.isPeriodic()).thenReturn(true);
    when(periodicFeeRate.getFeeType()).thenReturn(RateAmountFlag.RATE);
    when(periodicFeeRate.getFeeId()).thenReturn(Short.valueOf(PERIODIC_FEE_2));
    when(periodicFeeRate.getFeeName()).thenReturn("periodic fee2");

    when(nonPeriodicFeeRate.isPeriodic()).thenReturn(false);
    when(nonPeriodicFeeRate.getFeeType()).thenReturn(RateAmountFlag.RATE);
    when(nonPeriodicFeeRate.getFeeId()).thenReturn(Short.valueOf(NON_PERIODIC_FEE));
    when(nonPeriodicFeeRate.getFeeName()).thenReturn("non Periodic fee");
    when(((RateFeeBO) nonPeriodicFeeRate).getFeeFormula()).thenReturn(feeFormulaEntity);
    when(feeFormulaEntity.getFeeFormula()).thenReturn(FeeFormula.INTEREST);

    List<FeeBO> allPrdFees = new ArrayList<FeeBO>();
    allPrdFees.add(periodicFeeRate);
    allPrdFees.add(nonPeriodicFeeRate);

    when(request.getAttribute(Constants.CURRENTFLOWKEY)).thenReturn(FLOW_KEY);
    when(request.getSession()).thenReturn(session);
    when(session.getAttribute(Constants.FLOWMANAGER)).thenReturn(flowManager);
    when(session.getAttribute(ProductDefinitionConstants.LOANPRDFEE)).thenReturn(allPrdFees);

    Flow flow = new Flow();
    try {
      when(flowManager.getFromFlow(Mockito.anyString(), Mockito.anyString()))
          .thenReturn(allPrdFees);
      when(flowManager.getFlowWithValidation(FLOW_KEY)).thenReturn(flow);
    } catch (PageExpiredException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    ActionMessageMatcher actionMessageMatcher =
        new ActionMessageMatcher(ProductDefinitionConstants.PERIODIC_FEE_NOT_APPLICABLE);

    loanPrdActionForm.setCanConfigureVariableInstallments(true);
    loanPrdActionForm.setPrdOfferinFees(new String[] {PERIODIC_FEE_2, NON_PERIODIC_FEE});

    loanPrdActionForm.validateSelectedFeeForVariableInstallment(request, errors);
    Mockito.verify(errors, Mockito.times(1))
        .add(Mockito.anyString(), Mockito.argThat(actionMessageMatcher));
  }
  public void testSuccessfulCreatePeriodicFeeWithFormula() throws Exception {
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "load");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();
    flowKey = request.getAttribute(Constants.CURRENTFLOWKEY).toString();
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "preview");
    addRequestParameter("categoryType", FeeCategory.LOAN.getValue().toString());
    addRequestParameter("currencyId", TestUtils.RUPEE.getCurrencyId().toString());
    addRequestParameter("rate", "23");
    addRequestParameter("amount", "");
    addRequestParameter("feeFormula", FeeFormula.AMOUNT.getValue().toString());
    addRequestParameter("feeName", "Loan_Periodic_Fee");
    addRequestParameter("customerDefaultFee", "0");
    addRequestParameter("feeFrequencyType", FeeFrequencyType.PERIODIC.getValue().toString());
    addRequestParameter("feeRecurrenceType", RecurrenceType.WEEKLY.getValue().toString());
    addRequestParameter("weekRecurAfter", "2");
    addRequestParameter("glCode", GLOCDE_ID);
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();
    verifyNoActionErrors();

    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "create");
    addRequestParameter(
        "org.apache.struts.taglib.html.TOKEN",
        (String) request.getSession().getAttribute("org.apache.struts.action.TOKEN"));
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();
    verifyNoActionErrors();
    verifyForward(ActionForwards.create_success.toString());

    FeeActionForm actionForm = (FeeActionForm) request.getSession().getAttribute("feeactionform");
    fee = (FeeBO) TestObjectFactory.getObject(FeeBO.class, actionForm.getFeeIdValue());

    Assert.assertEquals("Loan_Periodic_Fee", fee.getFeeName());
    Assert.assertEquals(FeeCategory.LOAN.getValue(), fee.getCategoryType().getId());
    Assert.assertEquals(RateAmountFlag.RATE, fee.getFeeType());
    Assert.assertEquals(23.0, ((RateFeeBO) fee).getRate(), DELTA);
    Assert.assertEquals(
        ((RateFeeBO) fee).getFeeFormula().getId(), FeeFormula.AMOUNT.getValue(), DELTA);
    Assert.assertTrue(fee.isPeriodic());
    Assert.assertTrue(fee.isActive());
  }
  public void testSuccessfulViewAllFees() throws Exception {
    StaticHibernateUtil.startTransaction();
    fee =
        TestObjectFactory.createOneTimeRateFee(
            "Group_Fee", FeeCategory.GROUP, 10.0, FeeFormula.AMOUNT, FeePayment.UPFRONT);
    fee1 =
        TestObjectFactory.createOneTimeRateFee(
            "Customer_Fee", FeeCategory.ALLCUSTOMERS, 20.0, FeeFormula.AMOUNT, FeePayment.UPFRONT);
    fee2 =
        TestObjectFactory.createOneTimeRateFee(
            "Loan_Fee1", FeeCategory.LOAN, 30.0, FeeFormula.AMOUNT, FeePayment.UPFRONT);
    fee3 =
        TestObjectFactory.createOneTimeRateFee(
            "Center_Fee", FeeCategory.CENTER, 40.0, FeeFormula.AMOUNT, FeePayment.UPFRONT);
    StaticHibernateUtil.commitTransaction();
    StaticHibernateUtil.closeSession();
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "viewAll");

    actionPerform();
    verifyNoActionErrors();
    verifyForward(ActionForwards.viewAll_success.toString());
    flowKey = request.getAttribute(Constants.CURRENTFLOWKEY).toString();
    request.setAttribute(Constants.CURRENTFLOWKEY, flowKey);
    List<FeeBO> customerFees =
        (List<FeeBO>) SessionUtils.getAttribute(FeeConstants.CUSTOMER_FEES, request);
    List<FeeBO> productFees =
        (List<FeeBO>) SessionUtils.getAttribute(FeeConstants.PRODUCT_FEES, request);
    Assert.assertEquals(3, customerFees.size());
    Assert.assertEquals(1, productFees.size());

    Assert.assertEquals("Center_Fee", customerFees.get(0).getFeeName());
    Assert.assertEquals("Customer_Fee", customerFees.get(1).getFeeName());
    Assert.assertEquals("Group_Fee", customerFees.get(2).getFeeName());

    Assert.assertEquals("Loan_Fee1", productFees.get(0).getFeeName());

    fee = (FeeBO) TestObjectFactory.getObject(FeeBO.class, fee.getFeeId());
    fee1 = (FeeBO) TestObjectFactory.getObject(FeeBO.class, fee1.getFeeId());
    fee2 = (FeeBO) TestObjectFactory.getObject(FeeBO.class, fee2.getFeeId());
    fee3 = (FeeBO) TestObjectFactory.getObject(FeeBO.class, fee3.getFeeId());
  }
  public void testSuccessfulCreateOneTimeFee() throws Exception {
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "load");
    actionPerform();
    flowKey = request.getAttribute(Constants.CURRENTFLOWKEY).toString();
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "preview");
    addRequestParameter("categoryType", FeeCategory.ALLCUSTOMERS.getValue().toString());
    addRequestParameter("currencyId", TestUtils.RUPEE.getCurrencyId().toString());
    addRequestParameter("amount", "100");
    addRequestParameter("feeName", "Customer_One_time");
    addRequestParameter("feeFrequencyType", FeeFrequencyType.ONETIME.getValue().toString());
    addRequestParameter("customerCharge", FeePayment.UPFRONT.getValue().toString());
    addRequestParameter("glCode", GLOCDE_ID);
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();
    verifyNoActionErrors();
    setRequestPathInfo("/feeaction.do");
    addRequestParameter("method", "create");
    addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
    actionPerform();
    verifyNoActionErrors();
    verifyForward(ActionForwards.create_success.toString());

    FeeActionForm actionForm = (FeeActionForm) request.getSession().getAttribute("feeactionform");
    fee = (FeeBO) TestObjectFactory.getObject(FeeBO.class, actionForm.getFeeIdValue());
    Assert.assertEquals("Customer_One_time", fee.getFeeName());
    Assert.assertEquals(FeeCategory.ALLCUSTOMERS.getValue(), fee.getCategoryType().getId());
    Assert.assertEquals(RateAmountFlag.AMOUNT, fee.getFeeType());
    Assert.assertEquals(new Money(getCurrency(), "100.0"), ((AmountFeeBO) fee).getFeeAmount());
    Assert.assertTrue(fee.isOneTime());
    Assert.assertFalse(fee.isCustomerDefaultFee());
    Assert.assertTrue(fee.isActive());
  }
 public void testSuccessfulGetFee() throws Exception {
   fee =
       TestObjectFactory.createOneTimeAmountFee(
           "One Time Fee", FeeCategory.ALLCUSTOMERS, "100", FeePayment.UPFRONT);
   request.setAttribute(Constants.CURRENTFLOWKEY, flowKey);
   setRequestPathInfo("/feeaction.do");
   addRequestParameter("method", "get");
   addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
   addRequestParameter("feeId", fee.getFeeId().toString());
   actionPerform();
   fee = (FeeBO) SessionUtils.getAttribute(Constants.BUSINESS_KEY, request);
   Assert.assertNotNull(fee);
 }