package fitnesse.responders.testHistory; import static fitnesse.reporting.history.PageHistory.BarGraph; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static util.RegexTestCase.assertDoesntHaveRegexp; import static util.RegexTestCase.assertHasRegexp; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Set; import fitnesse.reporting.history.PageHistory; import fitnesse.reporting.history.TestHistory; import fitnesse.reporting.history.TestResultRecord; import org.junit.After; import org.junit.Before; import org.junit.Test; import fitnesse.FitNesseContext; import fitnesse.http.MockRequest; import fitnesse.http.SimpleResponse; import fitnesse.testsystems.TestSummary; import fitnesse.testutil.FitNesseUtil; import util.FileUtil; public class TestHistoryResponderTest { private File resultsDirectory; private SimpleDateFormat dateFormat = new SimpleDateFormat(PageHistory.TEST_RESULT_FILE_DATE_PATTERN); private TestHistoryResponder responder; private SimpleResponse response; private FitNesseContext context; @Before public void setup() throws IOException { context = FitNesseUtil.makeTestContext(); resultsDirectory = context.getTestHistoryDirectory(); removeResultsDirectory(); resultsDirectory.mkdirs(); responder = new TestHistoryResponder(); } private void makeResponse() throws Exception { response = (SimpleResponse) responder.makeResponse(context, new MockRequest()); } private void removeResultsDirectory() throws IOException { if (resultsDirectory.exists()) FileUtil.deleteFileSystemDirectory(resultsDirectory); } private void addPageDirectoryWithOneResult(String pageName, String testResultFileName) throws IOException { File pageDirectory = addPageDirectory(pageName); addTestResult(pageDirectory, testResultFileName); } private File addPageDirectory(String pageName) { File pageDirectory = new File(resultsDirectory, pageName); pageDirectory.mkdir(); return pageDirectory; } @After public void teardown() throws IOException { removeResultsDirectory(); } @Test public void emptyHistoryDirectoryShouldShowNoPages() throws Exception { TestHistory history = new TestHistory(resultsDirectory); assertEquals(0, history.getPageNames().size()); } @Test public void historyDirectoryWithOnePageDirectoryShouldShowOnePage() throws Exception { addPageDirectoryWithOneResult("SomePage", "20090418123103_1_2_3_4"); TestHistory history = new TestHistory(resultsDirectory); assertEquals(1, history.getPageNames().size()); assertTrue(history.getPageNames().contains("SomePage")); } @Test public void historyDirectoryWithOneEmptyPageDirectoryShouldShowNoPages() throws Exception { addPageDirectory("SomePage"); TestHistory history = new TestHistory(resultsDirectory); assertEquals(0, history.getPageNames().size()); assertFalse(history.getPageNames().contains("SomePage")); } @Test public void historyDirectoryWithTwoPageDirectoriesShouldShowTwoPages() throws Exception { addPageDirectoryWithOneResult("PageOne", "20090418123103_1_2_3_4"); addPageDirectoryWithOneResult("PageTwo", "20090418123103_1_2_3_4"); TestHistory history = new TestHistory(resultsDirectory); assertEquals(2, history.getPageNames().size()); assertTrue(history.getPageNames().contains("PageOne")); assertTrue(history.getPageNames().contains("PageTwo")); } @Test public void historyDirectoryWithTwoEmptyPageDirectoriesShouldShowNoPages() throws Exception { addPageDirectory("SomePage"); addPageDirectory("SomeOtherPage"); TestHistory history = new TestHistory(resultsDirectory); assertEquals(0, history.getPageNames().size()); assertFalse(history.getPageNames().contains("SomePage")); assertFalse(history.getPageNames().contains("SomeOtherPage")); } @Test public void testHistoryWithPageSelectedShouldShowPagesBelowSelectedPage() throws Exception { addPageDirectoryWithOneResult("ParentOne.PageOne", "20090418123103_1_2_3_4"); addPageDirectoryWithOneResult("ParentOne.PageTwo", "20090418123103_1_2_3_4"); addPageDirectoryWithOneResult("ParentTwo.PageThree", "20090418123103_1_2_3_4"); TestHistory history = new TestHistory(resultsDirectory, "ParentOne"); Set<String> pageNames = history.getPageNames(); assertEquals(2, pageNames.size()); assertTrue(pageNames.contains("ParentOne.PageOne")); assertTrue(pageNames.contains("ParentOne.PageTwo")); } @Test public void pageDirectoryWithNoResultsShouldShowNoHistory() throws Exception { addPageDirectory("SomePage"); TestHistory history = new TestHistory(resultsDirectory); PageHistory pageHistory = history.getPageHistory("SomePage"); assertNull(pageHistory); } @Test public void pageDirectoryWithOneResultShouldShowOneHistoryRecord() throws Exception { addPageDirectoryWithOneResult("SomePage", "20090418123103_1_2_3_4"); TestHistory history = new TestHistory(resultsDirectory); PageHistory pageHistory = history.getPageHistory("SomePage"); assertEquals(1, pageHistory.getFailures()); assertEquals(0, pageHistory.getPasses()); Date date = dateFormat.parse("20090418123103"); assertEquals(date, pageHistory.getMinDate()); assertEquals(date, pageHistory.getMaxDate()); assertEquals(1, pageHistory.size()); TestResultRecord testResultRecord = pageHistory.get(date); assertEquals(date, testResultRecord.getDate()); assertEquals(new TestSummary(1, 2, 3, 4), testResultRecord.toTestSummary()); } private File addTestResult(File pageDirectory, String testResultFileName) throws IOException { File testResultFile = new File(pageDirectory, testResultFileName + ".xml"); testResultFile.createNewFile(); return testResultFile; } @Test public void pageDirectoryWithThreeResults() throws Exception { File pageDirectory = addPageDirectory("SomePage"); addTestResult(pageDirectory, "20090418000000_1_0_0_0"); addTestResult(pageDirectory, "20090419000000_1_1_0_0"); addTestResult(pageDirectory, "20090417000000_1_0_0_1"); TestHistory history = new TestHistory(resultsDirectory); PageHistory pageHistory = history.getPageHistory("SomePage"); assertEquals(3, pageHistory.size()); assertEquals(dateFormat.parse("20090417000000"), pageHistory.getMinDate()); assertEquals(dateFormat.parse("20090419000000"), pageHistory.getMaxDate()); assertEquals(1, pageHistory.getPasses()); assertEquals(2, pageHistory.getFailures()); assertEquals(new TestSummary(1, 0, 0, 0), pageHistory.get(dateFormat.parse("20090418000000")).toTestSummary()); assertEquals(new TestSummary(1, 1, 0, 0), pageHistory.get(dateFormat.parse("20090419000000")).toTestSummary()); assertEquals(new TestSummary(1, 0, 0, 1), pageHistory.get(dateFormat.parse("20090417000000")).toTestSummary()); } @Test public void barGraphWithOnePassingResultShouldBeSingleTrueBoolean() throws Exception { BarGraph barGraph = makeBarGraph(new String[]{"20090418123103_1_0_0_0"}); assertEquals(1, barGraph.size()); assertTrue(barGraph.getPassFail(0).isPass()); } private BarGraph makeBarGraph(String[] testResultFilenames) throws IOException { File pageDirectory = addPageDirectory("SomePage"); for (String fileName : testResultFilenames) addTestResult(pageDirectory, fileName); TestHistory history = new TestHistory(resultsDirectory); PageHistory pageHistory = history.getPageHistory("SomePage"); BarGraph barGraph = pageHistory.getBarGraph(); return barGraph; } @Test public void barGraphWithOneFailingResultShouldBeSingleFalseBoolean() throws Exception { BarGraph barGraph = makeBarGraph(new String[]{"20090418123103_0_1_0_0"}); assertEquals(1, barGraph.size()); assertFalse(barGraph.getPassFail(0).isPass()); } private BarGraph makeBarGraphWithManyResults() throws IOException { BarGraph barGraph = makeBarGraph(new String[]{ "20090418123103_0_0_0_0", //18Apr FAIL "20090419123104_1_0_0_0", //19Apr PASS "20090420123105_0_1_0_0", //20Apr FAIL "20090421123106_0_0_1_0", //21Apr FAIL "20090422123107_0_0_0_1", //22Apr FAIL "20090423123108_1_1_0_0", //23Apr FAIL "20090424123109_1_0_1_0", //24Apr PASS "20090425123110_1_0_0_1" //25Apr FAIL }); return barGraph; } @Test public void barGraphWithManyResultsShouldHaveCorrespondingBooleans() throws Exception { BarGraph barGraph = makeBarGraphWithManyResults(); assertEquals("-+----+-", barGraph.testString()); } @Test public void barGraphWithOneResultShouldHaveSameStartingAndEndingDate() throws Exception { BarGraph barGraph = makeBarGraph(new String[]{"20090418123103_1_0_0_0"}); assertEquals(dateFormat.parse("20090418123103"), barGraph.getStartingDate()); assertEquals(dateFormat.parse("20090418123103"), barGraph.getEndingDate()); } @Test public void barGraphWithManyResultsShouldHaveStartingAndEndingDateCorrect() throws Exception { BarGraph barGraph = makeBarGraphWithManyResults(); assertEquals(dateFormat.parse("20090418123103"), barGraph.getStartingDate()); assertEquals(dateFormat.parse("20090425123110"), barGraph.getEndingDate()); } @Test public void BarGraphResultsAreInReverseChronologicalOrder() throws Exception { String apr17Fail = "20090417123103_0_1_0_0"; String apr18Pass = "20090418123103_1_0_0_0"; BarGraph barGraph = makeBarGraph(new String[]{apr17Fail, apr18Pass}); assertEquals("+-", barGraph.testString()); } @Test public void barGraphLimitedToLast20Results() throws Exception { ArrayList<String> dates = new ArrayList<>(); for (int day = 1; day < 32; day++) { int right = (day == 31) ? 1 : 0; dates.add(String.format("200905%02d010203_%1d_0_0_0", day, right)); } BarGraph barGraph = makeBarGraph(dates.toArray(new String[dates.size()])); assertEquals(20, barGraph.size()); assertEquals(dateFormat.parse("20090512010203"), barGraph.getStartingDate()); assertEquals(dateFormat.parse("20090531010203"), barGraph.getEndingDate()); assertEquals("+-------------------", barGraph.testString()); } @Test public void responseWithNoHistoryShouldSayNoHistory() throws Exception { makeResponse(); assertHasRegexp("No History", response.getContent()); } @Test public void whenPageDirectoriesHaveNoResultsResponseShouldSayNoHistory() throws Exception { addPageDirectory("SomePage"); makeResponse(); assertHasRegexp("No History", response.getContent()); } @Test public void testHistoryFormatMatchesRegularExpression() throws Exception { assertTrue(PageHistory.matchesPageHistoryFileFormat("20090513134559_01_02_03_04.xml")); } @Test public void whenPageDirectoryHasResultsRepsonseShouldShowSummary() throws Exception { File pageDirectory = addPageDirectory("SomePage"); addTestResult(pageDirectory, "20090418123103_1_2_3_4"); addTestResult(pageDirectory, "20090419123103_1_0_0_0"); makeResponse(); assertHasRegexp("SomePage", response.getContent()); assertHasRegexp("<td class=\"pass\">1</td>", response.getContent()); assertHasRegexp("<td class=\"fail\">1</td>", response.getContent()); assertHasRegexp("<td>19 Apr 09, 12:31</td>", response.getContent()); assertHasRegexp("<td class=\"pass\">.*\\+.*</td>", response.getContent()); assertHasRegexp("<td class=\"fail\">.*-.*</td>", response.getContent()); assertDoesntHaveRegexp("No History", response.getContent()); } @Test public void shouldNotCountABadDirectoryNameAsAHistoryDirectory() throws Exception { addPageDirectoryWithOneResult("SomePage", "20090419123103_1_0_0_0"); addPageDirectoryWithOneResult("bad+directory+name", "20090419123103_1_0_0_0"); TestHistory history = new TestHistory(resultsDirectory); assertEquals(1, history.getPageNames().size()); assertTrue(history.getPageNames().contains("SomePage")); } @Test public void shouldGenerateHistoryEvenWithBadFileNames() throws Exception { File pageDirectory = addPageDirectory("SomePage"); addTestResult(pageDirectory, "20090602000000_1_0_0_0"); //good addTestResult(pageDirectory, "20090603000000_12_1_0_0"); //good addTestResult(pageDirectory, "20090604000000_1_0_125_0"); //good addTestResult(pageDirectory, "2009060200000012_1_0_0_0"); //bad addTestResult(pageDirectory, "20090602000000_1_0_0_0_0_0"); //bad addTestResult(pageDirectory, "bad_file_page_thing"); //bad makeResponse(); TestHistory history = new TestHistory(resultsDirectory); PageHistory pageHistory = history.getPageHistory("SomePage"); assertEquals(3, pageHistory.size()); } @Test public void shouldBeAbleToAcceptFormatIsXMLforARequest() throws Exception { MockRequest request = new MockRequest(); request.addInput("format", "xml"); response = (SimpleResponse) responder.makeResponse(context, request); assertHasRegexp("text/xml", response.getContentType()); } @Test public void shouldntBeCaseSensitiveForXMLRequest() throws Exception { MockRequest request = new MockRequest(); request.addInput("format", "xML"); response = (SimpleResponse) responder.makeResponse(context, request); assertHasRegexp("text/xml", response.getContentType()); } }