protected void setUp() throws Exception {
    mConfig = new Configuration();
    mConfig.setTestMode(true);
    mConfig.save();

    // 刪除資料庫
    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();

    // create project
    mCP = new CreateProject(1);
    mCP.exeCreate();

    // create sprint
    mCS = new CreateSprint(2, mCP);
    mCS.exe();

    mProject = mCP.getAllProjects().get(0);
    super.setUp();

    // ================ set action info ========================
    setContextDirectory(new File(mConfig.getBaseDirPath() + "/WebContent"));
    setServletConfigFile("/WEB-INF/struts-config.xml");
    setRequestPathInfo(mActionPath);

    ini = null;
  }
  @Before
  public void setUp() {
    mConfig = new Configuration();
    mConfig.setTestMode(true);
    mConfig.save();

    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();

    mCP = new CreateProject(1);
    mCP.exeCreate();

    mData = new StoryDataForFilter();
  }
  @After
  public void tearDown() {
    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();
    // 刪除外部檔案
    ProjectManager projectManager = new ProjectManager();
    projectManager.deleteAllProject();

    // 讓 config 回到  Production 模式
    mConfig.setTestMode(false);
    mConfig.save();

    mCP = null;
    mData = null;
  }
  /** no story */
  public void testAddExistedStory_1() {
    long sprintId = mCS.getSprintsId().get(0);
    String releaseId = "-1";
    String[] selects = {};

    // ================ set request info ========================
    String projectName = mProject.getName();
    request.setHeader("Referer", "?PID=" + projectName);
    addRequestParameter("selects", selects);
    addRequestParameter("sprintID", String.valueOf(sprintId));
    addRequestParameter("releaseID", releaseId);

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());

    // ================ 執行 action ======================
    actionPerform();

    // ================ assert ========================
    verifyNoActionErrors();
    verifyNoActionMessages();
    // assert response text
    String expectedResponseText = "";
    String actualResponseText = response.getWriterBuffer().toString();
    assertEquals(expectedResponseText, actualResponseText);
  }
  // case 1: no sprint
  public void testNoSprint() throws Exception {
    // ================ set initial data =======================
    IProject project = mCP.getProjectList().get(0);
    // ================ set initial data =======================

    // ================== set parameter info ====================
    addRequestParameter("sprintID", Integer.toString(-1)); // 取得第一筆 SprintPlan
    // ================== set parameter info ====================

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());
    request.getSession().setAttribute("Project", project);
    // ================ set session info ========================
    request.setHeader(
        "Referer", "?PID=" + project.getName()); // SessionManager 會對URL的參數作分析 ,未帶入此參數無法存入session

    actionPerform(); // 執行 action

    // 驗證回傳 path
    verifyForwardPath(null);
    verifyForward(null);
    verifyNoActionErrors();

    // 比對資料是否正確(sprintID = -1)
    String expected =
        "<Retrospectives><Sprint><Id>-1</Id><Name>Sprint #-1</Name></Sprint></Retrospectives>";
    //    	System.out.println("response: " + response.getWriterBuffer().toString());
    assertEquals(expected, response.getWriterBuffer().toString());
  }
  // case 5: One sprint with 1 Good + 1 Improvement
  public void testOneSprint1g1i() throws Exception {
    mCS = new CreateSprint(1, mCP);
    mCS.exe(); // 新增一個 Sprint	

    mCR = new CreateRetrospective(1, 1, mCP, mCS);
    mCR.exe();

    // ================ set initial data =======================
    IProject project = mCP.getProjectList().get(0);
    long sprintID = mCS.getSprintsId().get(0);
    // ================ set initial data =======================

    // ================== set parameter info ====================
    addRequestParameter("sprintID", String.valueOf(sprintID)); // 取得第一筆 SprintPlan
    // ================== set parameter info ====================

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());
    request.getSession().setAttribute("Project", project);
    // ================ set session info ========================
    request.setHeader(
        "Referer", "?PID=" + project.getName()); // SessionManager 會對URL的參數作分析 ,未帶入此參數無法存入session

    actionPerform(); // 執行 action

    // 驗證回傳 path
    verifyForwardPath(null);
    verifyForward(null);
    verifyNoActionErrors();

    // 比對資料是否正確
    String expected = genXML(String.valueOf(sprintID));
    assertEquals(expected, response.getWriterBuffer().toString());
  }
  /** 專案擁有一個Sprint但該專案沒有成員 */
  public void testShowInformationAction_2() {
    int sprintCount = 1;
    CreateSprint createSprint = new CreateSprint(sprintCount, mCP);
    createSprint.exe();

    // ================ set request info ========================
    String expectedSprintID = "1";
    String projectName = mProject.getName();
    request.setHeader("Referer", "?PID=" + projectName);
    addRequestParameter("sprintID", expectedSprintID);

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());

    // ================ 執行 action ======================
    actionPerform();

    // ================ assert ========================
    verifyNoActionErrors();
    verifyNoActionMessages();
    /*
     * in struts-config.xml
     * <forward name="success" path="sprintInformation.show"/>
     * 因此根據sprintInformation.show必須到tiles-defs.xml找到要轉發的頁面
     * in tiles-defs.xml
     * <definition name="sprintInformation.show" path="/Pages/ShowSprintInformation.jsp"></definition>
     */
    verifyForward("success");
    verifyForwardPath("/Pages/ShowSprintInformation.jsp");

    String actualSprintID = String.valueOf(request.getAttribute("SprintID"));
    String actualStoryPoint = String.valueOf(request.getAttribute("StoryPoint"));
    ISprintPlanDesc actualSprintPlan = (ISprintPlanDesc) request.getAttribute("SprintPlan");
    String actualActors = String.valueOf(request.getAttribute("Actors"));
    String actualSprintPeriod = String.valueOf(request.getAttribute("SprintPeriod"));
    @SuppressWarnings("unchecked")
    ArrayList<StoryObject> actualIIssueList =
        (ArrayList<StoryObject>) request.getAttribute("Stories");

    TestTool testTool = new TestTool();
    Date today = createSprint.mToday;
    Date startDate = testTool.getSprintStartDate(CreateSprint.SPRINT_INTERVAL, today);
    Date endDate = testTool.getSprintEndDate(CreateSprint.SPRINT_INTERVAL, today);
    String expectedSprintPeriod =
        testTool.transformDate(startDate) + " to " + testTool.transformDate(endDate);

    assertEquals(expectedSprintID, actualSprintID); // 	verify sprint ID
    assertEquals("0.0", actualStoryPoint); // 	verify story points
    assertNotNull(actualSprintPlan); // 	verify sprint plan object
    assertEquals(
        createSprint.TEST_SPRINT_GOAL + expectedSprintID,
        actualSprintPlan.getGoal()); // 	verify sprint goal
    assertEquals("[]", actualActors); // 	verify 參與此專案的人(因為尚未加入團隊成員因此為空的)
    assertEquals(expectedSprintPeriod, actualSprintPeriod); // 	verify Sprint週期
    //	verify story information
    assertNotNull(actualIIssueList);
    assertEquals(0, actualIIssueList.size());
    assertEquals("0.0", actualStoryPoint); // 	verify story points
  }
  @After
  public void tearDown() {
    // 初始化 SQL
    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();

    // 刪除外部檔案
    ProjectManager projectManager = new ProjectManager();
    projectManager.deleteAllProject();

    mConfig.setTestMode(false);
    mConfig.save();

    // release
    ini = null;
    mCP = null;
    mProject = null;
    mConfig = null;
    mControl = null;
  }
  @Before
  public void setUp() {
    mConfig = new Configuration();
    mConfig.setTestMode(true);
    mConfig.save();

    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();

    mCP = new CreateProject(mProjectCount);
    mCP.exeCreate();

    mControl = new MySQLControl(mConfig);
    mControl.connect();

    mProject = mCP.getAllProjects().get(0);

    // create a retrospective
    mRtrospectiveId = createRetrospective();
  }
  protected void tearDown() throws IOException, Exception {
    //	刪除資料庫
    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();

    //	刪除外部檔案
    ProjectManager projectManager = new ProjectManager();
    projectManager.deleteAllProject();

    // 讓 config 回到  Production 模式
    mConfig.setTestMode(false);
    mConfig.save();

    // ============= release ==============
    ini = null;
    mCP = null;
    mConfig = null;

    super.tearDown();
  }
  protected void tearDown() throws Exception {
    // 刪除資料庫
    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();

    // 刪除外部檔案
    ProjectManager projectManager = new ProjectManager();
    projectManager.deleteAllProject();

    mConfig.setTestMode(false);
    mConfig.save();

    super.tearDown();

    ini = null;
    projectManager = null;
    mCP = null;
    mCS = null;
    mConfig = null;
    mProject = null;
  }
  protected void setUp() throws Exception {
    mConfig = new Configuration();
    mConfig.setTestMode(true);
    mConfig.save();

    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe(); // 初始化 SQL

    mCP = new CreateProject(1);
    mCP.exeCreate(); // 新增一測試專案

    super.setUp();

    setContextDirectory(new File(mConfig.getBaseDirPath() + "/WebContent")); // 設定讀取的
    // struts-config
    // 檔案路徑
    setServletConfigFile("/WEB-INF/struts-config.xml");
    setRequestPathInfo("/showRetrospective2");

    // ============= release ==============
    ini = null;
  }
  protected void setUp() throws Exception {
    mConfig = new Configuration();
    mConfig.setTestMode(true);
    mConfig.save();

    // 初始化 SQL
    InitialSQL ini = new InitialSQL(mConfig);
    ini.exe();

    //	新增一測試專案
    mCP = new CreateProject(1);
    mCP.exeCreate();
    mProject = mCP.getAllProjects().get(0);

    super.setUp();

    setContextDirectory(
        new File(mConfig.getBaseDirPath() + "/WebContent")); // 設定讀取的 struts-config 檔案路徑
    setServletConfigFile("/WEB-INF/struts-config.xml");
    setRequestPathInfo(mACTION_PATH);

    // ============= release ==============
    ini = null;
  }
  /** 專案沒有一個 Sprint */
  public void testShowInformationAction_1() {
    // ================ set request info ========================
    String sprintId = "1";
    String projectName = mProject.getName();

    request.setHeader("Referer", "?PID=" + projectName);
    addRequestParameter("sprintID", sprintId);

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());

    // ================ 執行 action ======================
    actionPerform();

    // ================ assert ========================
    verifyNoActionErrors();
    verifyNoActionMessages();
    verifyForward("error");
    verifyForwardPath("/Error.jsp");
  }
  /** two stories */
  public void testAddExistedStory_2() {
    int storyCount = 2;
    CreateProductBacklog CPB = new CreateProductBacklog(storyCount, mCP);
    CPB.exe();

    long sprintId = mCS.getSprintsId().get(0);
    String releaseID = "-1";
    String[] selects = {"1", "2"};

    // ================ set request info ========================
    String projectName = mProject.getName();
    request.setHeader("Referer", "?PID=" + projectName);
    addRequestParameter("selects", selects);
    addRequestParameter("sprintID", String.valueOf(sprintId));
    addRequestParameter("releaseID", releaseID);

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());

    // ================ 執行 action ======================
    actionPerform();

    // ================ assert ========================
    verifyNoActionErrors();
    verifyNoActionMessages();
    // assert response text
    String actualResponseText = response.getWriterBuffer().toString();
    StringBuilder expectedResponseText = new StringBuilder();
    expectedResponseText.append("");
    assertEquals(expectedResponseText.toString(), actualResponseText);

    // 驗證是否確實有被加入sprint中
    String showSprintBacklog_ActionPath = "/showSprintBacklog2";
    setRequestPathInfo(showSprintBacklog_ActionPath);

    clearRequestParameters();
    response.reset();

    // ================ set request info ========================
    request.setHeader("Referer", "?PID=" + projectName);
    addRequestParameter("sprintID", String.valueOf(sprintId));

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());

    // ================ 執行 action ======================
    actionPerform();

    // ================ assert ========================
    verifyNoActionErrors();
    verifyNoActionMessages();
    // assert response text
    String expectedStoryEstimation = "2";
    String expectedSprintGoal = "TEST_SPRINTGOAL_1";
    String expectedSprintHoursToCommit = "10";
    for (int i = 0; i < mCS.getSprintCount() - 1; i++) {
      expectedResponseText
          .append("{\"success\":true,\"Total\":2,")
          .append("\"Sprint\":{")
          .append("\"Id\":")
          .append(sprintId)
          .append(",")
          .append("\"Name\":\"Sprint #")
          .append(sprintId)
          .append("\",")
          .append("\"CurrentPoint\":")
          .append(Integer.parseInt(expectedStoryEstimation) * 2)
          .append(",")
          .append("\"LimitedPoint\":")
          .append(Integer.parseInt(expectedSprintHoursToCommit))
          .append(",")
          .append("\"TaskPoint\":0,")
          .append("\"ReleaseID\":\"Release #None\",")
          .append("\"SprintGoal\":\"")
          .append(expectedSprintGoal)
          .append("\"},")
          .append("\"Stories\":[");

      for (StoryObject story : CPB.getStories()) {
        expectedResponseText
            .append("{\"Id\":")
            .append(story.getId())
            .append(",")
            .append("\"Link\":\"")
            .append("\",")
            .append("\"Name\":\"")
            .append(story.getName())
            .append("\",")
            .append("\"Value\":")
            .append(story.getValue())
            .append(",")
            .append("\"Importance\":")
            .append(story.getImportance())
            .append(",")
            .append("\"Estimate\":")
            .append(story.getEstimate())
            .append(",")
            .append("\"Status\":\"new\",")
            .append("\"Notes\":\"")
            .append(story.getNotes())
            .append("\",")
            .append("\"Tag\":\"\",")
            .append("\"HowToDemo\":\"")
            .append(story.getHowToDemo())
            .append("\",")
            .append("\"Release\":\"\",")
            .append("\"Sprint\":")
            .append(sprintId)
            .append(",")
            .append("\"Attach\":false,")
            .append("\"AttachFileList\":[]},");
      }
      expectedResponseText.deleteCharAt(expectedResponseText.length() - 1);
      expectedResponseText.append("]}");
    }
    actualResponseText = response.getWriterBuffer().toString();
    assertEquals(expectedResponseText.toString(), actualResponseText);
  }
  /**
   * 專案擁有一個Sprint且專案擁有一位成員
   *
   * @throws Exception
   */
  public void testShowInformationAction_3() throws Exception {
    int sprintCount = 1;
    CreateSprint createSprint = new CreateSprint(sprintCount, mCP);
    createSprint.exe();

    int storyCount = 1;
    int expectStoryEstimation = 5;
    AddStoryToSprint addStoryToSprint =
        new AddStoryToSprint(
            storyCount,
            expectStoryEstimation,
            createSprint,
            mCP,
            CreateProductBacklog.COLUMN_TYPE_EST);
    addStoryToSprint.exe();

    int accountCount = 1;
    CreateAccount createAccount = new CreateAccount(accountCount);
    createAccount.exe();
    AddUserToRole addUserToRole = new AddUserToRole(mCP, createAccount);
    addUserToRole.exe_ST();

    // ================ set request info ========================
    String expectedSprintID = "1";
    String projectName = mProject.getName();
    request.setHeader("Referer", "?PID=" + projectName);
    addRequestParameter("sprintID", expectedSprintID);

    // ================ set session info ========================
    request.getSession().setAttribute("UserSession", mConfig.getUserSession());

    // ================ 執行 action ======================
    actionPerform();

    // ================ assert ========================
    verifyNoActionErrors();
    verifyNoActionMessages();
    /*
     * in struts-config.xml
     * <forward name="success" path="sprintInformation.show"/>
     * 因此根據sprintInformation.show必須到tiles-defs.xml找到要轉發的頁面
     * in tiles-defs.xml
     * <definition name="sprintInformation.show" path="/Pages/ShowSprintInformation.jsp"></definition>
     */
    verifyForward("success");
    verifyForwardPath("/Pages/ShowSprintInformation.jsp");

    String actualSprintID = String.valueOf(request.getAttribute("SprintID"));
    String actualStoryPoint = String.valueOf(request.getAttribute("StoryPoint"));
    ISprintPlanDesc actualSprintPlan = (ISprintPlanDesc) request.getAttribute("SprintPlan");
    String actualSprintPeriod = String.valueOf(request.getAttribute("SprintPeriod"));
    @SuppressWarnings("unchecked")
    ArrayList<StoryObject> actualStories = (ArrayList<StoryObject>) request.getAttribute("Stories");
    @SuppressWarnings("unchecked")
    ArrayList<String> actualActors = (ArrayList<String>) request.getAttribute("Actors");

    TestTool testTool = new TestTool();
    Date today = createSprint.mToday;
    Date startDate = testTool.getSprintStartDate(CreateSprint.SPRINT_INTERVAL, today);
    Date endDate = testTool.getSprintEndDate(CreateSprint.SPRINT_INTERVAL, today);
    String expectedSprintPeriod =
        testTool.transformDate(startDate) + " to " + testTool.transformDate(endDate);

    /**
     * 1. verify sprint ID 2. verify story information 3. verify sprint plan information 5. verify
     * Sprint週期 6. verify 參與此專案的人
     */
    //	verify sprint ID
    assertEquals(expectedSprintID, actualSprintID);

    //	verify story information
    assertNotNull(actualStories);
    assertEquals("TEST_STORY_1", actualStories.get(0).getName());
    assertEquals("5.0", actualStoryPoint);

    //	verify sprint plan information
    assertNotNull(actualSprintPlan);
    assertEquals(createSprint.TEST_SPRINT_GOAL + expectedSprintID, actualSprintPlan.getGoal());

    //	verify Sprint週期
    assertEquals(expectedSprintPeriod, actualSprintPeriod);

    //	verify 參與此專案的人
    String expectAccountID = createAccount.getAccount_ID(1);
    boolean isExistedAccount = false;
    for (String accountID : actualActors) {
      if (accountID.equals(expectAccountID)) {
        isExistedAccount = true;
        break;
      }
    }
    assertTrue(isExistedAccount);
  }