/**
   * This test ensures that the "processTab" method correctly adds an annotation. This function is
   * required to support the new prompt for saving the record when the user clicks "add" for
   * annotations. Refer to https://sourceforge.net/p/webcurator/enhancements/84/
   *
   * @throws Exception
   */
  @Test
  public final void testProcessTab() throws Exception {
    HttpServletRequest aReq = new MockHttpServletRequest();
    SiteManager siteManager = new MockSiteManagerImpl(testFile);
    testInstance.setSiteManager(siteManager);
    Site site = siteManager.getSite(9000L, true);
    List<Annotation> list = createAnnotationList();
    assertFalse(checkSortedList(list));
    site.setAnnotations(list);
    SiteEditorContext ctx = new SiteEditorContext(site);
    aReq.getSession().setAttribute(SiteController.EDITOR_CONTEXT, ctx);
    HttpServletResponse aResp = new MockHttpServletResponse();
    SiteCommand aCmd = new SiteCommand();
    TabbedController tc = new SiteController();

    TabConfig tabConfig = new TabConfig();
    tabConfig.setViewName("site");
    List<Tab> tabs = getTabList(siteManager);
    tabConfig.setTabs(tabs);

    tc.setTabConfig(tabConfig);

    Tab currentTab = tabs.get(0);
    aCmd.setCmdAction(SiteCommand.ACTION_ADD_NOTE);
    aCmd.setAnnotation("A note");
    BindException aErrors = new BindException(aCmd, aCmd.getCmdAction());

    List<Annotation> resultAnnotations = site.getAnnotations();
    int numAnnotations = resultAnnotations.size();

    testInstance.processTab(tc, currentTab, aReq, aResp, aCmd, aErrors);
    assertEquals(resultAnnotations.size(), numAnnotations + 1);
    Annotation resultAnnotation = resultAnnotations.get(resultAnnotations.size() - 1);
    assertEquals("A note", resultAnnotation.getNote());
  }
  @Test
  public final void testPreProcessNextTab() {

    try {
      HttpServletRequest aReq = new MockHttpServletRequest();
      SiteManager siteManager = new MockSiteManagerImpl(testFile);
      testInstance.setSiteManager(siteManager);
      Site site = siteManager.getSite(9000L, true);
      List<Annotation> list = createAnnotationList();
      assertFalse(checkSortedList(list));
      site.setAnnotations(list);
      SiteEditorContext ctx = new SiteEditorContext(site);
      aReq.getSession().setAttribute(SiteController.EDITOR_CONTEXT, ctx);
      HttpServletResponse aResp = new MockHttpServletResponse();
      SiteCommand aCmd = new SiteCommand();
      TabbedController tc = new SiteController();

      TabConfig tabConfig = new TabConfig();
      tabConfig.setViewName("site");
      List<Tab> tabs = getTabList(siteManager);
      tabConfig.setTabs(tabs);

      tc.setTabConfig(tabConfig);

      Tab currentTab = tabs.get(0);
      BindException aErrors = new BindException(aCmd, aCmd.getCmdAction());

      ModelAndView mav = testInstance.preProcessNextTab(tc, currentTab, aReq, aResp, aCmd, aErrors);
      assertNotNull(mav);
      assertTrue(checkSortedList(site.getAnnotations()));
    } catch (Exception e) {
      fail(e.getMessage());
    }
  }
  @Test
  public final void testProcessOther() {
    try {
      HttpServletRequest aReq = new MockHttpServletRequest();
      SiteManager siteManager = new MockSiteManagerImpl(testFile);
      testInstance.setSiteManager(siteManager);
      Site site = siteManager.getSite(9000L, true);
      List<Annotation> list = createAnnotationList();
      assertFalse(checkSortedList(list));
      site.setAnnotations(list);
      SiteEditorContext ctx = new SiteEditorContext(site);
      aReq.getSession().setAttribute(SiteController.EDITOR_CONTEXT, ctx);
      HttpServletResponse aResp = new MockHttpServletResponse();
      SiteCommand aCmd = new SiteCommand();
      TabbedController tc = new SiteController();

      TabConfig tabConfig = new TabConfig();
      tabConfig.setViewName("site");
      List<Tab> tabs = getTabList(siteManager);
      tabConfig.setTabs(tabs);

      tc.setTabConfig(tabConfig);

      Tab currentTab = tabs.get(0);
      aCmd.setCmdAction(SiteCommand.ACTION_ADD_NOTE);
      aCmd.setAnnotation("A note");
      BindException aErrors = new BindException(aCmd, aCmd.getCmdAction());

      int numAnnotations = site.getAnnotations().size();

      ModelAndView mav = testInstance.processOther(tc, currentTab, aReq, aResp, aCmd, aErrors);
      assertTrue(mav != null);
      assertTrue(mav.getViewName().equals("site"));
      assertTrue(
          ((TabStatus) mav.getModel().get("tabStatus"))
              .getCurrentTab()
              .getPageId()
              .equals("GENERAL"));
      int listSize = site.getAnnotations().size();
      assertTrue(listSize > 0);
      int noteIndex = 0;
      assertTrue(site.getAnnotations().size() == (numAnnotations + 1));
      assertTrue(site.getAnnotations().get(noteIndex).getNote().equals("A note"));
      assertTrue(checkSortedList(site.getAnnotations()));

      currentTab = tabs.get(0);
      aCmd.setCmdAction(SiteCommand.ACTION_MODIFY_NOTE);
      aCmd.setAnnotation("A new note");
      aCmd.setAnnotationIndex(noteIndex);
      aErrors = new BindException(aCmd, aCmd.getCmdAction());

      mav = testInstance.processOther(tc, currentTab, aReq, aResp, aCmd, aErrors);
      assertTrue(mav != null);
      assertTrue(mav.getViewName().equals("site"));
      assertTrue(
          ((TabStatus) mav.getModel().get("tabStatus"))
              .getCurrentTab()
              .getPageId()
              .equals("GENERAL"));
      listSize = site.getAnnotations().size();
      assertTrue(listSize > 0);
      int newNoteIndex = 0;
      assertTrue(newNoteIndex == noteIndex);
      assertTrue(site.getAnnotations().size() == (numAnnotations + 1));
      assertFalse(site.getAnnotations().get(noteIndex).getNote().equals("A note"));
      assertTrue(site.getAnnotations().get(noteIndex).getNote().equals("A new note"));
      assertTrue(checkSortedList(site.getAnnotations()));

      currentTab = tabs.get(0);
      aCmd.setCmdAction(SiteCommand.ACTION_DELETE_NOTE);
      aCmd.setAnnotationIndex(noteIndex);
      aErrors = new BindException(aCmd, aCmd.getCmdAction());

      mav = testInstance.processOther(tc, currentTab, aReq, aResp, aCmd, aErrors);
      assertTrue(mav != null);
      assertTrue(mav.getViewName().equals("site"));
      assertTrue(
          ((TabStatus) mav.getModel().get("tabStatus"))
              .getCurrentTab()
              .getPageId()
              .equals("GENERAL"));
      int newListSize = site.getAnnotations().size();
      assertTrue(newListSize == (listSize - 1));
      assertTrue(site.getAnnotations().size() == numAnnotations);
      assertTrue(checkSortedList(site.getAnnotations()));
    } catch (Exception e) {
      fail(e.getMessage());
    }
  }