package fitnesse.responders.run.formatters;
import fitnesse.responders.run.TestPage;
import org.junit.Test;
import org.junit.Assert;
import org.junit.Before;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.VelocityEngine;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.InMemoryPage;
import fitnesse.FitNesseContext;
import fitnesse.FitNesseVersion;
import fitnesse.responders.run.TestSummary;
import fitnesse.responders.run.TestExecutionReport;
import fitnesse.responders.run.SuiteExecutionReport;
import fitnesse.responders.run.SuiteExecutionReport.PageHistoryReference;
import fitnesse.responders.testHistory.TestHistory;
import fitnesse.responders.testHistory.PageHistory;
import fitnesse.responders.testHistory.TestResultRecord;
import fitnesse.testutil.FitNesseUtil;
import util.DateTimeUtil;
import util.TimeMeasurement;
import java.io.StringWriter;
import java.io.Writer;
import java.io.File;
import java.util.Date;
public class CachingSuiteXmlFormatterTest {
private CachingSuiteXmlFormatter formatter;
private FitNesseContext context;
private WikiPage root;
private TestSummary testSummary;
private TestPage testPage;
private long testTime;
@Before
public void setUp() throws Exception {
root = InMemoryPage.makeRoot("RooT");
context = FitNesseUtil.makeTestContext(root);
testSummary = new TestSummary(1,2,3,4);
testPage = new TestPage(root.addChildPage("TestPage"));
formatter = new CachingSuiteXmlFormatter(context,root, null);
testTime = DateTimeUtil.getTimeFromString("10/8/1988 10:52:12");
}
@Test
public void canCreateFormatter() throws Exception {
Assert.assertTrue(formatter instanceof BaseFormatter);
assertEquals(0, formatter.getPageHistoryReferences().size());
}
@Test
public void shouldRememberThePageNameAndDateAndRunTime() throws Exception {
formatter = newNonWritingCachingSuiteXmlFormatter();
formatter.announceNumberTestsToRun(1);
TimeMeasurement timeMeasurement = constantStartTimeAndElapsedTimeMeasurement(testTime, 39);
formatter.newTestStarted(testPage, timeMeasurement);
formatter.testComplete(testPage, testSummary, timeMeasurement);
assertEquals(1, formatter.getPageHistoryReferences().size());
PageHistoryReference pageHistoryReference = formatter.getPageHistoryReferences().get(0);
assertEquals("TestPage", pageHistoryReference.getPageName());
assertEquals(testTime, pageHistoryReference.getTime());
assertEquals(39, pageHistoryReference.getRunTimeInMillis());
formatter.allTestingComplete(constantStartTimeAndElapsedTimeMeasurement(testTime, 49));
assertEquals(49, formatter.suiteExecutionReport.getTotalRunTimeInMillis());
}
@Test
public void shouldDelegateToReportForTotalRunTime() throws Exception {
formatter.suiteExecutionReport = mock(SuiteExecutionReport.class);
formatter.getTotalRunTimeInMillis();
verify(formatter.suiteExecutionReport).getTotalRunTimeInMillis();
}
private CachingSuiteXmlFormatter newNonWritingCachingSuiteXmlFormatter() throws Exception {
return new CachingSuiteXmlFormatter(context,root, null) {
@Override
protected void writeOutSuiteXML() {
}
};
}
private TimeMeasurement constantStartTimeAndElapsedTimeMeasurement(final long startTime, final long elapsed) {
return new TimeMeasurement() {
@Override
public long startedAt() {
return startTime;
}
@Override
public long elapsed() {
return elapsed;
}
};
}
@Test
public void allTestsCompleteShouldReadTestHistoryAndInvokeVelocity() throws Exception {
formatter.announceNumberTestsToRun(0);
TestHistory testHistory = mock(TestHistory.class);
formatter.setTestHistoryForTests(testHistory);
VelocityContext velocityContext = mock(VelocityContext.class);
VelocityEngine velocityEngine = mock(VelocityEngine.class);
Writer writer = mock(Writer.class);
formatter.setVelocityForTests(velocityContext, velocityEngine, writer);
Template template = mock(Template.class);
when(velocityEngine.getTemplate("suiteXML.vm")).thenReturn(template);
formatter.allTestingComplete(new TimeMeasurement().start().stop());
verify(testHistory).readHistoryDirectory(context.getTestHistoryDirectory());
verify(velocityContext).put("formatter", formatter);
verify(velocityEngine).getTemplate("suiteXML.vm");
verify(template).merge(velocityContext, writer);
verify(writer).close();
}
@Test
public void formatterShouldReturnTestResultsGivenAPageHistoryReference() throws Exception {
TestHistory testHistory = mock(TestHistory.class);
PageHistory pageHistory = mock(PageHistory.class);
TestResultRecord expectedRecord = mock(TestResultRecord.class);
File file = mock(File.class);
final TestExecutionReport expectedReport = mock(TestExecutionReport.class);
CachingSuiteXmlFormatter formatter = new CachingSuiteXmlFormatter(context, testPage.getSourcePage(), null) {
@Override
TestExecutionReport makeTestExecutionReport() {
return expectedReport;
}
};
Date referenceDate = DateTimeUtil.getDateFromString("12/5/1952 1:19:00");
formatter.setTestHistoryForTests(testHistory);
when(testHistory.getPageHistory("TestPage")).thenReturn(pageHistory);
when(expectedRecord.getFile()).thenReturn(file);
when(pageHistory.get(referenceDate)).thenReturn(expectedRecord);
when(expectedReport.read(file)).thenReturn(expectedReport);
SuiteExecutionReport.PageHistoryReference reference;
reference = new SuiteExecutionReport.PageHistoryReference("TestPage", referenceDate.getTime(), 27);
TestExecutionReport actualReport = formatter.getTestExecutionReport(reference);
verify(testHistory).getPageHistory("TestPage");
verify(pageHistory).get(referenceDate);
assertSame(expectedReport, actualReport);
}
@Test
public void formatterShouldKnowVersionAndRootPage() throws Exception {
assertEquals("RooT", formatter.page.getName());
assertEquals(new FitNesseVersion().toString(), new FitNesseVersion().toString());
}
@Test
public void formatterWithNoTestsShouldHaveZeroPageCounts() throws Exception {
assertEquals(new TestSummary(0, 0, 0, 0), formatter.getPageCounts());
}
@Test
public void formatterShouldTallyPageCounts() throws Exception {
TimeMeasurement timeMeasurement = new TimeMeasurement();
formatter.newTestStarted(testPage, timeMeasurement.start());
formatter.testComplete(testPage, new TestSummary(32, 0, 0, 0), timeMeasurement.stop()); // 1 right.
assertEquals(new TestSummary(1, 0, 0, 0), formatter.getPageCounts());
}
}