public void testAdvanceReportWorkflow() {
    Integer id = 10;
    Integer wfId = 5;
    String transitionToTake = "abcd";
    String loginId = "SYSTEM_ADMIN";
    ReviewStatus reviewStatus = ReviewStatus.DRAFT_INCOMPLETE;
    Report report = Fixtures.createReport("testReport");
    report.setStatus(ReportStatus.INPROCESS);
    report.setReviewComments(new ArrayList<ReportReviewComment>());
    report.setWorkflowId(wfId);
    List<String> transitions = new ArrayList<String>();

    ReportSubmittability errorMessagesMock = registerMockFor(ReportSubmittability.class);
    EasyMock.expect(errorMessagesMock.isSubmittable()).andReturn(true);
    EasyMock.expect(reportValidationService.isSubmittable(report)).andReturn(errorMessagesMock);
    EasyMock.expect(wfService.nextTransitionNames(wfId, loginId)).andReturn(transitions);
    EasyMock.expect(wfService.advanceWorkflow(wfId, transitionToTake)).andReturn(reviewStatus);
    EasyMock.expect(reportDao.getById(id)).andReturn(report);
    reportDao.save(report);
    replayMocks();
    List<String> transitionsNames = impl.advanceReportWorkflow(wfId, transitionToTake, id, loginId);

    verifyMocks();
    assertEquals(
        "A review comment for the action of advancing workflow was not added",
        1,
        report.getReviewCommentsInternal().size());
  }
  public void testNextTransitionsForAeReportWithCompleteReports() throws Exception {
    Report report = Fixtures.createReport("testReport");
    report.setWorkflowId(1);
    ReportSubmittability errorMessagesMock = registerMockFor(ReportSubmittability.class);
    report.setStatus(ReportStatus.PENDING);
    List<String> transitions = new ArrayList<String>();
    transitions.add("test action");
    transitions.add("Submit to Central Office Report Reviewer");

    EasyMock.expect(wfService.nextTransitionNames(1, "SYSTEM_ADMIN")).andReturn(transitions);
    EasyMock.expect(reportValidationService.isSubmittable(report)).andReturn(errorMessagesMock);
    EasyMock.expect(errorMessagesMock.isSubmittable()).andReturn(true);
    replayMocks();
    List<String> filteredTransitions =
        impl.nextTransitionNamesForReportWorkflow(report, "SYSTEM_ADMIN");
    verifyMocks();
    assertEquals(2, filteredTransitions.size());
  }
  // test the transition, were the physician can login to the system.
  public void testNextTransitionsForAeReportWithAnInvestigatorHavingLogin() throws Exception {
    Report report = Fixtures.createReport("testReport");
    Investigator investigator = Fixtures.createInvestigator("tester");
    investigator.setLoginId("hai");
    report.getPhysician().setPerson(investigator);
    report.setWorkflowId(1);
    ReportSubmittability errorMessagesMock = registerMockFor(ReportSubmittability.class);
    report.setStatus(ReportStatus.PENDING);
    List<String> transitions = new ArrayList<String>();
    transitions.add("test action");
    transitions.add("Send to Physician for Review");

    EasyMock.expect(wfService.nextTransitionNames(1, "SYSTEM_ADMIN")).andReturn(transitions);
    EasyMock.expect(reportValidationService.isSubmittable(report)).andReturn(errorMessagesMock);
    EasyMock.expect(errorMessagesMock.isSubmittable()).andReturn(true);
    replayMocks();
    List<String> filteredTransitions =
        impl.nextTransitionNamesForReportWorkflow(report, "SYSTEM_ADMIN");
    verifyMocks();
    assertEquals(1, filteredTransitions.size());
  }
  @SuppressWarnings("unchecked")
  @Override
  protected Map referenceData(
      final HttpServletRequest request, final Object cmd, final Errors errors) throws Exception {
    ReviewAeReportCommand command = (ReviewAeReportCommand) cmd;
    Map<String, Object> refdata = new HashMap<String, Object>();
    Map<Integer, ReportSubmittability> reportMessages =
        new HashMap<Integer, ReportSubmittability>();

    // evaluate business rules.
    ReportSubmittability reportSubmittability = new ReportSubmittability();
    for (ExpeditedReportSection section : ExpeditedReportSection.values()) {

      if (!section.isAssociatedToBusinessRules()) continue;

      ValidationErrors validationErrors =
          evaluationService.validateReportingBusinessRules(command.getAeReport(), section);
      for (ValidationError vError : validationErrors.getErrors()) {
        reportSubmittability.addValidityMessage(
            section,
            messageSource.getMessage(
                vError.getCode(),
                vError.getReplacementVariables(),
                vError.getMessage(),
                Locale.getDefault()));
      }
    }

    reportMessages.put(ExpeditedAdverseEventInputCommand.ZERO, reportSubmittability);

    // -- check the report submittability
    for (Report report : command.getAeReport().getReports()) {
      reportMessages.put(report.getId(), reportValidationService.isSubmittable(report));
    }
    refdata.put("reportMessages", reportMessages);

    // This is to check if the logged in person is SAE-Coordinator.
    // Data coordinator cannot submit a report.
    boolean isReportReviewer =
        SecurityUtils.hasAuthorityOf(UserGroupType.ae_expedited_report_reviewer);

    // boolean canSubmit = false;
    // if(reportMessages.get(command.ZERO).isSubmittable() &&
    // reportMessages.get(command.getReportId()).isSubmittable() && isReportReviewer)
    //	canSubmit = true;

    // refdata.put("canSubmit", canSubmit);
    refdata.put("isUserSAECoordinato", isReportReviewer);

    // additional information documents

    Integer additionalInformationId = command.getAeReport().getAdditionalInformation().getId();
    List<AdditionalInformationDocument> additionalInformationDocuments =
        additionalInformationDocumentService.findByAdditionalInformationId(additionalInformationId);

    Map<String, List<AdditionalInformationDocument>> documents =
        AdditionalInformationDocument.groupDocumentsByDocumentType(additionalInformationDocuments);

    refdata.put("documents", documents);
    refdata.put("additionalInformationId", additionalInformationId);

    return refdata;
  }