/src/fitnesse/responders/testHistory/PageHistoryResponderTest.java

http://github.com/unclebob/fitnesse · Java · 485 lines · 421 code · 64 blank · 0 comment · 6 complexity · 7961a4886ae52111e466ffa8ed9ba7f3 MD5 · raw file

  1. package fitnesse.responders.testHistory;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.mockito.Mockito.mock;
  4. import static org.mockito.Mockito.when;
  5. import static util.RegexTestCase.assertHasRegexp;
  6. import static util.RegexTestCase.assertSubString;
  7. import java.io.File;
  8. import java.io.FileWriter;
  9. import java.io.IOException;
  10. import java.text.ParseException;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. import java.util.SortedSet;
  14. import org.apache.velocity.Template;
  15. import org.apache.velocity.VelocityContext;
  16. import org.junit.After;
  17. import org.junit.Before;
  18. import org.junit.Test;
  19. import util.DateTimeUtil;
  20. import util.FileUtil;
  21. import util.RegexTestCase;
  22. import util.TimeMeasurement;
  23. import fitnesse.FitNesseContext;
  24. import fitnesse.FitNesseVersion;
  25. import fitnesse.http.MockRequest;
  26. import fitnesse.http.SimpleResponse;
  27. import fitnesse.responders.run.SuiteExecutionReport;
  28. import fitnesse.responders.run.TestExecutionReport;
  29. import fitnesse.responders.run.TestSummary;
  30. import fitnesse.testutil.FitNesseUtil;
  31. import fitnesse.wiki.InMemoryPage;
  32. import fitnesse.wiki.WikiPage;
  33. public class PageHistoryResponderTest {
  34. private File resultsDirectory;
  35. private TestHistory history;
  36. private SimpleDateFormat dateFormat = new SimpleDateFormat(TestHistory.TEST_RESULT_FILE_DATE_PATTERN);
  37. private PageHistoryResponder responder;
  38. private SimpleResponse response;
  39. private MockRequest request;
  40. private FitNesseContext context;
  41. private FitNesseVersion fitNesseVersion = new FitNesseVersion();
  42. @Before
  43. public void setup() throws Exception {
  44. resultsDirectory = new File("testHistoryDirectory");
  45. removeResultsDirectory();
  46. resultsDirectory.mkdir();
  47. history = new TestHistory();
  48. responder = new PageHistoryResponder();
  49. responder.setResultsDirectory(resultsDirectory);
  50. WikiPage root = InMemoryPage.makeRoot("RooT");
  51. context = FitNesseUtil.makeTestContext(root);
  52. }
  53. @After
  54. public void teardown() {
  55. removeResultsDirectory();
  56. }
  57. private void makeResponse() throws Exception {
  58. request = new MockRequest();
  59. request.setResource("TestPage");
  60. WikiPage root = InMemoryPage.makeRoot("RooT");
  61. response = (SimpleResponse) responder.makeResponse(FitNesseUtil.makeTestContext(root), request);
  62. }
  63. private void removeResultsDirectory() {
  64. if (resultsDirectory.exists())
  65. FileUtil.deleteFileSystemDirectory(resultsDirectory);
  66. }
  67. private File addPageDirectory(String pageName) {
  68. File pageDirectory = new File(resultsDirectory, pageName);
  69. pageDirectory.mkdir();
  70. return pageDirectory;
  71. }
  72. private File addTestResult(File pageDirectory, String testResultFileName) throws IOException {
  73. File testResultFile = new File(pageDirectory, testResultFileName + ".xml");
  74. testResultFile.createNewFile();
  75. return testResultFile;
  76. }
  77. @Test
  78. public void shouldReportNoHistoryIfNoPageDirectory() throws Exception {
  79. makeResponse();
  80. assertHasRegexp("No history for page: TestPage", response.getContent());
  81. }
  82. @Test
  83. public void shouldReportNoHistoryIfNoHistoryInPageDirectory() throws Exception {
  84. addPageDirectory("TestPage");
  85. makeResponse();
  86. assertHasRegexp("No history for page: TestPage", response.getContent());
  87. }
  88. @Test
  89. public void pageHistoryShouldHaveStatsForOneTestIfOnePageHistoryFileIsPresent() throws Exception {
  90. File pageDirectory = addPageDirectory("TestPage");
  91. addTestResult(pageDirectory, "20090418123103_1_2_3_4");
  92. history.readHistoryDirectory(resultsDirectory);
  93. PageHistory pageHistory = history.getPageHistory("TestPage");
  94. assertEquals(1, pageHistory.size());
  95. assertEquals(7, pageHistory.maxAssertions());
  96. SortedSet<Date> dates = pageHistory.datesInChronologicalOrder();
  97. assertEquals(1, dates.size());
  98. Date date = dateFormat.parse("20090418123103");
  99. assertEquals(date, dates.first());
  100. PageHistory.PassFailBar passFailBar = pageHistory.getPassFailBar(date, 50);
  101. assertEquals(1, passFailBar.getPass());
  102. assertEquals(6, passFailBar.getFail());
  103. assertEquals(7, passFailBar.getPassUnits());
  104. assertEquals(43, passFailBar.getFailUnits());
  105. }
  106. @Test
  107. public void pageHistoryShouldHaveStatsForTwoTestsIfTwoPageHistoryFilesArePresent() throws Exception {
  108. File pageDirectory = addPageDirectory("TestPage");
  109. addTestResult(pageDirectory, "20090503110451_6_5_3_1");
  110. addTestResult(pageDirectory, "20090418123103_1_2_3_4");
  111. history.readHistoryDirectory(resultsDirectory);
  112. PageHistory pageHistory = history.getPageHistory("TestPage");
  113. assertEquals(2, pageHistory.size());
  114. assertEquals(12, pageHistory.maxAssertions());
  115. SortedSet<Date> dates = pageHistory.datesInChronologicalOrder();
  116. assertEquals(2, dates.size());
  117. Date date1 = dateFormat.parse("20090418123103");
  118. Date date2 = dateFormat.parse("20090503110451");
  119. Date[] dateArray = dates.toArray(new Date[dates.size()]);
  120. assertEquals(date1, dateArray[1]);
  121. assertEquals(date2, dateArray[0]);
  122. PageHistory.PassFailBar passFailBar = pageHistory.getPassFailBar(date1, 50);
  123. assertEquals(1, passFailBar.getPass());
  124. assertEquals(6, passFailBar.getFail());
  125. assertEquals(4, passFailBar.getPassUnits());
  126. assertEquals(25, passFailBar.getFailUnits());
  127. passFailBar = pageHistory.getPassFailBar(date2, 50);
  128. assertEquals(6, passFailBar.getPass());
  129. assertEquals(6, passFailBar.getFail());
  130. assertEquals(25, passFailBar.getPassUnits());
  131. assertEquals(25, passFailBar.getFailUnits());
  132. }
  133. @Test
  134. public void evenOneFailureShouldCountInTheFailUnit() throws Exception {
  135. PageHistory.PassFailBar passFailBar = computePassFailBarFor(1000, 1, 0, 0);
  136. assertEquals(49, passFailBar.getPassUnits());
  137. assertEquals(1, passFailBar.getFailUnits());
  138. }
  139. @Test
  140. public void exactMultiplesShouldWork() throws Exception {
  141. PageHistory.PassFailBar passFailBar = computePassFailBarFor(48, 2, 0, 0);
  142. assertEquals(48, passFailBar.getPassUnits());
  143. assertEquals(2, passFailBar.getFailUnits());
  144. }
  145. @Test
  146. public void AllRedIfFractionOfOneUnitPasses() throws Exception {
  147. PageHistory.PassFailBar passFailBar = computePassFailBarFor(1, 1000, 0, 0);
  148. assertEquals(0, passFailBar.getPassUnits());
  149. assertEquals(50, passFailBar.getFailUnits());
  150. }
  151. private PageHistory.PassFailBar computePassFailBarFor(int right, int wrong, int ignores, int exceptions) throws IOException, ParseException {
  152. File pageDirectory = addPageDirectory("TestPage");
  153. addTestResult(pageDirectory, String.format("20090503110451_%d_%d_%d_%d", right, wrong, ignores, exceptions));
  154. history.readHistoryDirectory(resultsDirectory);
  155. PageHistory pageHistory = history.getPageHistory("TestPage");
  156. Date date = dateFormat.parse("20090503110451");
  157. PageHistory.PassFailBar passFailBar = pageHistory.getPassFailBar(date, 50);
  158. return passFailBar;
  159. }
  160. @Test
  161. public void shouldNotReportNoHistoryIfHistoryIsPresent() throws Exception {
  162. addPageDirectory("TestPage");
  163. File pageDirectory = addPageDirectory("TestPage");
  164. addTestResult(pageDirectory, "20090503110455_6_5_3_1");
  165. makeResponse();
  166. RegexTestCase.assertDoesntHaveRegexp("No history for page: TestPage", response.getContent());
  167. }
  168. @Test
  169. public void singlePassingResultShouldHaveTableandHeaderRow() throws Exception {
  170. addPageDirectory("TestPage");
  171. File pageDirectory = addPageDirectory("TestPage");
  172. addTestResult(pageDirectory, "20090503110451_6_0_3_0");
  173. makeResponse();
  174. String content = response.getContent();
  175. content = content.replace("\n", " ");
  176. content = content.replace("\r", " ");
  177. assertHasRegexp("<table>.*<tr>.*<th>Time</th>.*<th>Pass</th>.*<th>Fail</th>.*<th colspan=\"50\">0..6</th>.*<tr", content);
  178. assertHasRegexp("</tr>.*</table>", content);
  179. }
  180. @Test
  181. public void singlePassingResultsShouldBeGreen() throws Exception {
  182. addPageDirectory("TestPage");
  183. File pageDirectory = addPageDirectory("TestPage");
  184. addTestResult(pageDirectory, "20090503110451_6_0_3_0");
  185. makeResponse();
  186. assertHasRegexp("<td .* class=\"pass\">.*03 May, 09 11:04.*</td>", response.getContent());
  187. }
  188. @Test
  189. public void singleFailingResultsShouldBeRed() throws Exception {
  190. addPageDirectory("TestPage");
  191. File pageDirectory = addPageDirectory("TestPage");
  192. addTestResult(pageDirectory, "20090503110451_6_1_3_0");
  193. makeResponse();
  194. assertHasRegexp("<td .* class=\"fail\">.*03 May, 09 11:04.*</td>", response.getContent());
  195. }
  196. @Test
  197. public void singleResultShouldShowPassFailStatistics() throws Exception {
  198. addPageDirectory("TestPage");
  199. File pageDirectory = addPageDirectory("TestPage");
  200. addTestResult(pageDirectory, "20090503110451_6_1_3_1");
  201. makeResponse();
  202. assertHasRegexp("<td .* class=\"fail\">2</td>", response.getContent());
  203. assertHasRegexp("<td .* class=\"pass\">6</td>", response.getContent());
  204. }
  205. @Test
  206. public void singleResultWithNoPassesOrFailuresShouldShowPassFailStatisticsInGrey() throws Exception {
  207. addPageDirectory("TestPage");
  208. File pageDirectory = addPageDirectory("TestPage");
  209. addTestResult(pageDirectory, "20090503110451_0_0_3_0");
  210. makeResponse();
  211. assertHasRegexp("<td .* class=\"ignore\">0</td>", response.getContent());
  212. assertHasRegexp("<td .* class=\"ignore\">0</td>", response.getContent());
  213. }
  214. @Test
  215. public void singleResultShouldShowPassFailBar() throws Exception {
  216. addPageDirectory("TestPage");
  217. File pageDirectory = addPageDirectory("TestPage");
  218. addTestResult(pageDirectory, "20090503110451_30_20_3_0");
  219. makeResponse();
  220. StringBuilder expected = new StringBuilder();
  221. for (int i = 0; i < 30; i++) {
  222. expected.append("<td id=\"element\" class=\"pass\">&nbsp</td>");
  223. }
  224. expected.append(".*");
  225. for (int i = 0; i < 20; i++) {
  226. expected.append("<td id=\"element\" class=\"fail\">&nbsp</td>");
  227. }
  228. assertHasRegexp(expected.toString(), response.getContent());
  229. }
  230. @Test
  231. public void shortResultShouldShowPassFailBarWithPadding() throws Exception {
  232. File pageDirectory = addPageDirectory("TestPage");
  233. addTestResult(pageDirectory, "20090503110451_30_20_3_0");
  234. addTestResult(pageDirectory, "20090503143157_10_5_3_0");
  235. makeResponse();
  236. StringBuilder expected = new StringBuilder();
  237. for (int i = 0; i < 10; i++) {
  238. expected.append("<td id=\"element\" class=\"pass\">&nbsp</td>");
  239. }
  240. expected.append(".*");
  241. for (int i = 0; i < 5; i++) {
  242. expected.append("<td id=\"element\" class=\"fail\">&nbsp</td>");
  243. }
  244. expected.append(".*");
  245. for (int i = 0; i < 35; i++) {
  246. expected.append("<td id=\"element\" class=\"ignore\">&nbsp</td>");
  247. }
  248. assertHasRegexp(expected.toString(), response.getContent());
  249. }
  250. @Test
  251. public void canGetTestExecutionReport() throws Exception {
  252. File pageDirectory = addPageDirectory("TestPage");
  253. File resultFile = new File(pageDirectory, "20090503110451_30_20_3_0.xml");
  254. addDummyTestResult(resultFile);
  255. makeResultForDate("TestPage", "20090503110451");
  256. assertHasRegexp(fitNesseVersion.toString(), response.getContent());
  257. assertHasRegexp("relativePageName", response.getContent());
  258. assertHasRegexp("11 Right", response.getContent());
  259. assertHasRegexp("22 Wrong", response.getContent());
  260. assertHasRegexp("33 Ignores", response.getContent());
  261. assertHasRegexp("44 Exceptions", response.getContent());
  262. assertHasRegexp("99 ms", response.getContent());
  263. assertHasRegexp("wad of HTML content", response.getContent());
  264. }
  265. @Test
  266. public void canGetSuiteExecutionReport() throws Exception {
  267. File pageDirectory = addPageDirectory("SuitePage");
  268. File resultFile = new File(pageDirectory, "19801205012000_30_20_3_0.xml");
  269. addDummySuiteResult(resultFile);
  270. makeResultForDate("SuitePage", "19801205012000");
  271. assertSubString(fitNesseVersion.toString(), response.getContent());
  272. assertSubString("SuitePage.TestPageOne?pageHistory&resultDate=19801205012000", response.getContent());
  273. assertHasRegexp("(12321 ms)", response.getContent());
  274. }
  275. @Test
  276. public void canGetLatestWhenOnlyOneTestResultExists() throws Exception {
  277. File pageDirectory = addPageDirectory("TestPage");
  278. addDummyTestResult(new File(pageDirectory, "19801205012000_30_20_3_0"));
  279. makeResultForDate("TestPage", "latest");
  280. assertHasRegexp("Fri Dec 05 01:20:00 [A-Z]+ 1980", response.getContent());
  281. }
  282. @Test
  283. public void canGetLatestWhenManyTestResultsExists() throws Exception {
  284. File pageDirectory = addPageDirectory("TestPage");
  285. addDummyTestResult(new File(pageDirectory, "19801205012000_30_20_3_0"));
  286. addDummyTestResult(new File(pageDirectory, "19901205012000_30_20_3_0"));
  287. addDummyTestResult(new File(pageDirectory, "19951205012000_30_20_3_0"));
  288. addDummyTestResult(new File(pageDirectory, "19941205012000_30_20_3_0"));
  289. makeResultForDate("TestPage", "latest");
  290. assertHasRegexp("Tue Dec 05 01:20:00 [A-Z]+ 1995", response.getContent());
  291. }
  292. private void addDummySuiteResult(File resultFile) throws Exception {
  293. SuiteExecutionReport report = makeDummySuiteResponse();
  294. report.version = fitNesseVersion.toString();
  295. report.date = DateTimeUtil.getDateFromString("12/5/1980 01:19:00");
  296. report.finalCounts = new TestSummary(4,5,6,7);
  297. report.rootPath = "SuitePage";
  298. TimeMeasurement timeMeasurement = mock(TimeMeasurement.class);
  299. when (timeMeasurement.elapsed()).thenReturn(12321L);
  300. report.setTotalRunTimeInMillis(timeMeasurement);
  301. long time = DateTimeUtil.getTimeFromString("12/5/1980 01:20:00");
  302. SuiteExecutionReport.PageHistoryReference r1 = new SuiteExecutionReport.PageHistoryReference("SuitePage.TestPageOne", time, 9);
  303. SuiteExecutionReport.PageHistoryReference r2 = new SuiteExecutionReport.PageHistoryReference("SuitePage.TestPageTwo", time, 11);
  304. r1.getTestSummary().right=4;
  305. r2.getTestSummary().right=4;
  306. report.addPageHistoryReference(r1);
  307. report.addPageHistoryReference(r2);
  308. generateSuiteResultFile(report, resultFile);
  309. }
  310. private void generateSuiteResultFile(SuiteExecutionReport report, File resultFile) throws Exception {
  311. VelocityContext velocityContext = new VelocityContext();
  312. velocityContext.put("suiteExecutionReport", report);
  313. Template template = context.pageFactory.getVelocityEngine().getTemplate("suiteHistoryXML.vm");
  314. FileWriter fileWriter = new FileWriter(resultFile);
  315. template.merge(velocityContext, fileWriter);
  316. fileWriter.close(); }
  317. private SuiteExecutionReport makeDummySuiteResponse() {
  318. return new SuiteExecutionReport();
  319. }
  320. private void makeResultForDate(String page, String resultDate) throws Exception {
  321. request = new MockRequest();
  322. request.setResource(page);
  323. request.addInput("resultDate", resultDate);
  324. response = (SimpleResponse) responder.makeResponse(context, request);
  325. }
  326. private void addDummyTestResult(File resultFile) throws Exception {
  327. TestExecutionReport testResponse = makeDummyTestResponse();
  328. generateTestResultFile(testResponse, resultFile);
  329. }
  330. private void generateTestResultFile(TestExecutionReport testResponse, File resultFile) throws Exception {
  331. VelocityContext velocityContext = new VelocityContext();
  332. velocityContext.put("response", testResponse);
  333. Template template = context.pageFactory.getVelocityEngine().getTemplate("testResults.vm");
  334. FileWriter fileWriter = new FileWriter(resultFile);
  335. template.merge(velocityContext, fileWriter);
  336. fileWriter.close();
  337. }
  338. private TestExecutionReport makeDummyTestResponse() {
  339. TestExecutionReport testResponse = new TestExecutionReport();
  340. testResponse.version = fitNesseVersion.toString();
  341. testResponse.rootPath = "rootPath";
  342. testResponse.finalCounts = new TestSummary(1, 2, 3, 4);
  343. TestExecutionReport.TestResult result = new TestExecutionReport.TestResult();
  344. testResponse.results.add(result);
  345. result.right = "11";
  346. result.wrong = "22";
  347. result.ignores = "33";
  348. result.exceptions = "44";
  349. result.relativePageName = "relativePageName";
  350. result.content = "wad of HTML content";
  351. result.runTimeInMillis = "99";
  352. return testResponse;
  353. }
  354. @Test
  355. public void shouldStillGenerateReponseAndBarWhenThereIsAnInvalidFileNameInList() throws Exception {
  356. File pageDirectory = addPageDirectory("TestPage");
  357. addTestResult(pageDirectory, "bad_File_name");
  358. addTestResult(pageDirectory, "20090418123103_1_2_3_4");
  359. history.readHistoryDirectory(resultsDirectory);
  360. PageHistory pageHistory = history.getPageHistory("TestPage");
  361. assertEquals(1, pageHistory.size());
  362. }
  363. @Test
  364. public void shouldStillMakeResponseWithCorruptTestResultFile() throws Exception {
  365. File pageDirectory = addPageDirectory("TestPage");
  366. File resultFile = new File(pageDirectory, "20090503110451_30_20_3_0");
  367. addBadDummyTestResult(resultFile);
  368. makeResultForDate("TestPage", "20090503110451");
  369. assertHasRegexp("Corrupt Test Result File", response.getContent());
  370. }
  371. @Test
  372. public void shouldBeAbleToAcceptFormatIsXMLforARequest() throws Exception {
  373. request = new MockRequest();
  374. request.setResource("TestPage");
  375. request.addInput("format", "xml");
  376. WikiPage root = InMemoryPage.makeRoot("RooT");
  377. response = (SimpleResponse) responder.makeResponse(FitNesseUtil.makeTestContext(root), request);
  378. assertEquals("text/xml", response.getContentType());
  379. }
  380. @Test
  381. public void shouldntBeCaseSensitiveForXMLRequest() throws Exception {
  382. request = new MockRequest();
  383. request.setResource("TestPage");
  384. request.addInput("format", "XMl");
  385. WikiPage root = InMemoryPage.makeRoot("RooT");
  386. response = (SimpleResponse) responder.makeResponse(FitNesseUtil.makeTestContext(root), request);
  387. assertEquals("text/xml", response.getContentType());
  388. }
  389. @Test
  390. public void shouldSendTestExecutionReportInXMLUponRequest() throws Exception {
  391. request = new MockRequest();
  392. request.setResource("TestPage");
  393. File pageDirectory = addPageDirectory("TestPage");
  394. File resultFile = new File(pageDirectory, "20090503110451_30_20_3_0");
  395. addDummyTestResult(resultFile);
  396. request.addInput("resultDate", "20090503110451");
  397. request.addInput("format", "xml");
  398. response = (SimpleResponse) responder.makeResponse(context, request);
  399. String content = response.getContent();
  400. assertHasRegexp("<FitNesseVersion>", content);
  401. assertEquals("text/xml", response.getContentType());
  402. }
  403. private void addBadDummyTestResult(File resultFile) throws Exception {
  404. FileUtil.createFile(resultFile, "JUNK");
  405. }
  406. private TestExecutionReport makeBadDummyTestResponse() {
  407. TestExecutionReport testResponse = new TestExecutionReport();
  408. testResponse.version = "v1";
  409. testResponse.rootPath = "rootPath";
  410. testResponse.finalCounts = new TestSummary(1, 2, 3, 4);
  411. TestExecutionReport.TestResult result = new TestExecutionReport.TestResult();
  412. testResponse.results.add(result);
  413. result.right = "xx";
  414. result.wrong = "22";
  415. result.ignores = "33";
  416. result.exceptions = "44";
  417. result.relativePageName = "relativePageName";
  418. result.content = "wad of HTML content";
  419. return testResponse;
  420. }
  421. }