package fitnesse.reporting.history;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import fitnesse.util.Clock;
import fitnesse.util.DateAlteringClock;
import fitnesse.wiki.PathParser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import util.FileUtil;
import static org.junit.Assert.*;
public class HistoryPurgerTest {
private File resultsDirectory;
private HistoryPurger historyPurger;
@Before
public void setUp() throws ParseException, IOException {
resultsDirectory = new File("testHistoryDirectory");
removeResultsDirectory();
resultsDirectory.mkdir();
new DateAlteringClock(makeDate("20090616000000")).freeze();
historyPurger = new HistoryPurger(resultsDirectory, 1);
}
@After
public void resetClock() {
Clock.restoreDefaultClock();
}
@Test
public void shouldBeAbleToSubtractDaysFromDates() throws Exception {
Date date = makeDate("20090616171615");
new DateAlteringClock(date).freeze();
Date resultDate = historyPurger.getDateDaysAgo(10);
Date tenDaysEarlier = makeDate("20090606171615");
assertEquals(tenDaysEarlier, resultDate);
}
@Test
public void shouldBeAbleToDeleteSomeTestHistory() throws Exception {
File pageDirectory = addPageDirectory("SomePage");
addTestResult(pageDirectory, "20090614000000_1_0_0_0");
addTestResult(pageDirectory, "20090615000000_1_0_0_0");
historyPurger.deleteTestHistoryOlderThanDays();
TestHistory history = new TestHistory(resultsDirectory);
PageHistory pageHistory = history.getPageHistory("SomePage");
assertEquals(1, pageHistory.size());
assertNotNull(pageHistory.get(makeDate("20090615000000")));
assertNull(pageHistory.get(makeDate("20090614000000")));
}
@Test
public void shouldBeAbleToDeletePagesFromASuite() throws Exception {
File pageDirectory = addPageDirectory("SomePage");
addTestResult(pageDirectory, "20090614000000_1_0_0_0");
addTestResult(pageDirectory, "20090615000000_1_0_0_0");
File subPageDirectory = addPageDirectory("SomePage.SubPage");
addTestResult(subPageDirectory, "20090614000000_1_0_0_0");
addTestResult(subPageDirectory, "20090615000000_1_0_0_0");
File otherPageDirectory = addPageDirectory("OtherPage");
addTestResult(otherPageDirectory, "20090614000000_1_0_0_0");
addTestResult(otherPageDirectory, "20090615000000_1_0_0_0");
historyPurger.deleteTestHistoryOlderThanDays(PathParser.parse("SomePage"));
TestHistory history = new TestHistory(resultsDirectory);
PageHistory pageHistory = history.getPageHistory("SomePage");
assertNotNull(pageHistory.get(makeDate("20090615000000")));
assertNull(pageHistory.get(makeDate("20090614000000")));
pageHistory = history.getPageHistory("SomePage.SubPage");
assertEquals(1, pageHistory.size());
assertNotNull(pageHistory.get(makeDate("20090615000000")));
assertNull(pageHistory.get(makeDate("20090614000000")));
pageHistory = history.getPageHistory("OtherPage");
assertEquals(2, pageHistory.size());
assertNotNull(pageHistory.get(makeDate("20090615000000")));
assertNotNull(pageHistory.get(makeDate("20090614000000")));
}
@Test
public void shouldDeletePageHistoryDirectoryIfEmptiedByPurge() throws Exception {
File pageDirectory = addPageDirectory("SomePage");
addTestResult(pageDirectory, "20090614000000_1_0_0_0");
File svnDirectory = addSubDirectory(pageDirectory, ".svn");
addTestResult(svnDirectory, "someFile");
historyPurger.deleteTestHistoryOlderThanDays();
String[] files = resultsDirectory.list();
assertEquals(1, files.length);
files = svnDirectory.list();
assertEquals(1, files.length);
}
@Test
public void fileWithInvalidDateWillNotBeRemoved() throws Exception {
File pageDirectory = addPageDirectory("SomePage");
addTestResult(pageDirectory, "someFile");
File svnDirectory = addSubDirectory(pageDirectory, ".svn");
addTestResult(svnDirectory, "anotherfile");
historyPurger.deleteTestHistoryOlderThanDays();
List<String> files = Arrays.asList(new File(resultsDirectory, "SomePage").list());
assertEquals(2, files.size());
assertTrue(files.contains(".svn"));
assertTrue(files.contains("someFile.xml"));
String[] svnFiles = svnDirectory.list();
assertEquals(1, svnFiles.length);
}
private void removeResultsDirectory() throws IOException {
if (resultsDirectory.exists())
FileUtil.deleteFileSystemDirectory(resultsDirectory);
}
private File addTestResult(File pageDirectory, String testResultFileName) throws IOException {
File testResultFile = new File(pageDirectory, testResultFileName + ".xml");
testResultFile.createNewFile();
return testResultFile;
}
private File addSubDirectory(File pageDirectory, String subDirectoryName) throws IOException {
File subDirectoryFile = new File(pageDirectory, subDirectoryName);
subDirectoryFile.mkdirs();
return subDirectoryFile;
}
private File addPageDirectory(String pageName) {
File pageDirectory = new File(resultsDirectory, pageName);
pageDirectory.mkdirs();
return pageDirectory;
}
private Date makeDate(String dateString) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(PageHistory.TEST_RESULT_FILE_DATE_PATTERN);
Date date = format.parse(dateString);
return date;
}
}