@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);
  }
 @Test
 public void shouldSetSelectedQuestionGroupsOnSession() throws PageExpiredException {
   when(request.getAttribute(Constants.CURRENTFLOWKEY)).thenReturn(FLOW_KEY);
   when(request.getSession()).thenReturn(session);
   when(session.getAttribute(Constants.FLOWMANAGER)).thenReturn(flowManager);
   Flow flow = new Flow();
   when(flowManager.getFlowWithValidation(FLOW_KEY)).thenReturn(flow);
   List<QuestionGroupDetail> questionGroupDetails =
       asList(
           getQuestionGroupDetail(1, "QG1"),
           getQuestionGroupDetail(2, "QG2"),
           getQuestionGroupDetail(3, "QG3"),
           getQuestionGroupDetail(4, "QG4"));
   when(flowManager.getFromFlow(FLOW_KEY, ProductDefinitionConstants.SRCQGLIST))
       .thenReturn(questionGroupDetails);
   loanPrdActionForm.setLoanOfferingQGs(new String[] {"1", "4"});
   loanPrdActionForm.setSelectedQuestionGroups(request);
   List<QuestionGroupDetail> selectedQGDetails =
       (List<QuestionGroupDetail>)
           flow.getObjectFromSession(ProductDefinitionConstants.SELECTEDQGLIST);
   assertThat(selectedQGDetails, is(notNullValue()));
   assertThat(selectedQGDetails.get(0).getId(), is(1));
   assertThat(selectedQGDetails.get(0).getTitle(), is("QG1"));
   assertThat(selectedQGDetails.get(1).getId(), is(4));
   assertThat(selectedQGDetails.get(1).getTitle(), is("QG4"));
 }
 @Test
 public void shouldSetSelectedQuestionGroupsOnSession() throws PageExpiredException {
   List<QuestionGroupDetail> questionGroupDetails =
       asList(
           getQuestionGroupDetail(1, "QG1", true),
           getQuestionGroupDetail(2, "QG2", true),
           getQuestionGroupDetail(3, "QG3", false));
   when(questionnaireServiceFacade.getQuestionGroupDetail(1))
       .thenReturn(questionGroupDetails.get(0));
   when(questionnaireServiceFacade.getQuestionGroupDetail(2))
       .thenReturn(questionGroupDetails.get(1));
   when(questionnaireServiceFacade.getQuestionGroupDetail(3))
       .thenReturn(questionGroupDetails.get(2));
   when(request.getAttribute(Constants.CURRENTFLOWKEY)).thenReturn(FLOW_KEY);
   when(request.getSession()).thenReturn(session);
   when(session.getAttribute(Constants.FLOWMANAGER)).thenReturn(flowManager);
   Flow flow = new Flow();
   when(flowManager.getFlowWithValidation(FLOW_KEY)).thenReturn(flow);
   LoanOfferingBO loanOfferingBO = new LoanProductBuilder().buildForUnitTests();
   loanOfferingBO.setQuestionGroups(getQustionGroups(1, 2, 3));
   loanPrdAction.setSelectedQuestionGroupsOnSession(
       request, loanOfferingBO, questionnaireServiceFacade);
   List<QuestionGroupDetail> questionGroupDetailList =
       (List<QuestionGroupDetail>)
           flow.getObjectFromSession(ProductDefinitionConstants.SELECTEDQGLIST);
   assertThat(questionGroupDetailList, is(notNullValue()));
   assertThat(questionGroupDetailList.size(), is(2));
   assertQuestionGroup(questionGroupDetailList.get(0), 1, "QG1");
   assertQuestionGroup(questionGroupDetailList.get(1), 2, "QG2");
   verify(questionnaireServiceFacade, times(3)).getQuestionGroupDetail(anyInt());
   verify(request, times(1)).getAttribute(Constants.CURRENTFLOWKEY);
   verify(request, times(1)).getSession();
   verify(session, times(1)).getAttribute(Constants.FLOWMANAGER);
 }
 @Test
 public void shouldGetQuestionGroupResponses() throws PageExpiredException {
   when(request.getAttribute(Constants.CURRENTFLOWKEY)).thenReturn(FLOW_KEY);
   when(request.getSession()).thenReturn(session);
   when(session.getAttribute(Constants.FLOWMANAGER)).thenReturn(flowManager);
   List<QuestionGroupDetail> questionGroupDetails =
       asList(
           getQuestionGroupDetail(1, "QG1", true),
           getQuestionGroupDetail(2, "QG2", true),
           getQuestionGroupDetail(3, "QG3", true));
   when(flowManager.getFromFlow(FLOW_KEY, ProductDefinitionConstants.SELECTEDQGLIST))
       .thenReturn(questionGroupDetails);
   Set<QuestionGroupReference> questionGroupReferences = loanPrdAction.getQuestionGroups(request);
   assertThat(questionGroupReferences, is(notNullValue()));
   assertThat(questionGroupReferences.size(), is(3));
   QuestionGroupReference[] qgReferences =
       questionGroupReferences.toArray(new QuestionGroupReference[questionGroupReferences.size()]);
   assertThat(qgReferences[0].getQuestionGroupId(), is(1));
   assertThat(qgReferences[1].getQuestionGroupId(), is(2));
   assertThat(qgReferences[2].getQuestionGroupId(), is(3));
   verify(request, times(1)).getAttribute(Constants.CURRENTFLOWKEY);
   verify(request, times(1)).getSession();
   verify(session, times(1)).getAttribute(Constants.FLOWMANAGER);
   verify(flowManager, times(1)).getFromFlow(FLOW_KEY, ProductDefinitionConstants.SELECTEDQGLIST);
 }
  @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));
  }
 @Test
 public void shouldSetQuestionGroupsOnSession() throws PageExpiredException {
   List<QuestionGroupDetail> questionGroupDetails =
       asList(
           getQuestionGroupDetail(1, "QG1", true),
           getQuestionGroupDetail(2, "QG2", true),
           getQuestionGroupDetail(3, "QG3", true));
   when(questionnaireServiceFacade.getQuestionGroups("Create", "Loan"))
       .thenReturn(questionGroupDetails);
   when(request.getAttribute(Constants.CURRENTFLOWKEY)).thenReturn(FLOW_KEY);
   when(request.getSession()).thenReturn(session);
   when(session.getAttribute(Constants.FLOWMANAGER)).thenReturn(flowManager);
   Flow flow = new Flow();
   when(flowManager.getFlowWithValidation(FLOW_KEY)).thenReturn(flow);
   loanPrdAction.setQuestionGroupsOnSession(request, questionnaireServiceFacade);
   assertThat(
       (List<QuestionGroupDetail>) flow.getObjectFromSession(ProductDefinitionConstants.SRCQGLIST),
       is(questionGroupDetails));
   verify(questionnaireServiceFacade, times(1)).getQuestionGroups("Create", "Loan");
   verify(request, times(1)).getAttribute(Constants.CURRENTFLOWKEY);
   verify(request, times(1)).getSession();
   verify(session, times(1)).getAttribute(Constants.FLOWMANAGER);
 }