package fitnesse.updates; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Properties; import fitnesse.FitNesseContext; import fitnesse.testutil.FitNesseUtil; import fitnesse.wiki.WikiPage; import fitnesse.wiki.fs.FileSystemPageFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import util.FileUtil; import static org.junit.Assert.*; import static util.RegexTestCase.assertSubString; public class WikiContentUpdaterTest { private File updateList; private File updateDoNotCopyOver; public static final String testDir = "testDir"; public static final String rootName = "RooT"; protected WikiPage root; protected WikiContentUpdater updater; protected WikiPage pageOne; protected WikiPage pageTwo; protected FitNesseContext context; private boolean updateDone = false; @Before public void setUp() throws Exception { setTheContext(rootName); root = setTheRoot(); createFakeJarFileResources(); createFakeUpdateListFiles(); updater = new WikiContentUpdater(context); } private WikiPage setTheRoot() throws Exception { return root; } private void setTheContext(String name) { FileUtil.makeDir(testDir); context = FitNesseUtil.makeTestContext(new FileSystemPageFactory(), testDir, name, 80); root = context.getRootPage(); root.commit(root.getData()); } private void createFakeUpdateListFiles() throws IOException { updateList = new File("build/classes/test/Resources/updateList"); updateDoNotCopyOver = new File("build/classes/test/Resources/updateDoNotCopyOverList"); FileUtil.createFile(updateList, "FitNesseRoot/files/TestFile\nFitNesseRoot/files/BestFile\n"); FileUtil.createFile(updateDoNotCopyOver, "FitNesseRoot/SpecialFile"); } private void createFakeJarFileResources() throws IOException { FileUtil.createFile("build/classes/test/Resources/FitNesseRoot/files/TestFile","") ; FileUtil.createFile("build/classes/test/Resources/FitNesseRoot/files/BestFile","") ; FileUtil.createFile("build/classes/test/Resources/FitNesseRoot/SpecialFile",""); } @Test public void shouldBeAbleToGetUpdateFilesAndMakeAlistFromThem() throws Exception { String[] updateArrayList = updater.parseResource("Resources/updateList"); assertEquals("FitNesseRoot/files/TestFile", updateArrayList[0]); assertEquals("FitNesseRoot/files/BestFile", updateArrayList[1]); updateArrayList = updater.parseResource("Resources/updateDoNotCopyOverList"); assertEquals("FitNesseRoot/SpecialFile", updateArrayList[0]); } @Test public void shouldBeAbleToGetThePathOfJustTheParent() throws Exception { File filePath = updater.getCorrectPathForTheDestination("build/classes/test/files/moreFiles/TestFile"); assertSubString(portablePath("build/classes/test/files/moreFiles"), filePath.getPath()); } private String portablePath(String path) { return path.replace("/", System.getProperty("file.separator")); } @Test public void shouldCreateTheCorrectPathForGivenPath() throws Exception { String filePath = updater.getCorrectPathFromJar("FitNesseRoot/files/moreFiles/TestFile"); assertEquals("Resources/FitNesseRoot/files/moreFiles/TestFile", filePath); } @Test public void shouldCreateSomeFilesInTheRooTDirectory() throws Exception { updater.update(); File testFile = new File(context.getRootPagePath(), "files/TestFile"); File bestFile = new File(context.getRootPagePath(), "files/BestFile"); File specialFile = new File(context.getRootPagePath(), "SpecialFile"); assertTrue(testFile.exists()); assertTrue(bestFile.exists()); assertTrue(specialFile.exists()); assertFalse(testFile.isDirectory()); assertFalse(bestFile.isDirectory()); assertFalse(specialFile.isDirectory()); } @Test public void shouldReplaceFitNesseRootWithDirectoryRoot() throws Exception { String filePath = "FitNesseRoot/someFolder/someFile"; setTheContext("MyNewRoot"); updater = new WikiContentUpdater(context); File updatedPath = updater.getCorrectPathForTheDestination(filePath); assertEquals(portablePath("testDir/MyNewRoot/someFolder"), updatedPath.getPath()); } @Test public void testProperties() throws Exception { updater = new WikiContentUpdater(context) { @Override List<Update> makeAllUpdates() { return Collections.emptyList(); } }; File file = new File(new File(testDir, rootName), "properties"); assertFalse(file.exists()); updater.update(); assertTrue(file.exists()); } @Test public void updatesShouldBeRunIfCurrentVersionNotAlreadyUpdated() throws Exception { updater = new WikiContentUpdater(context) { @Override List<Update> makeAllUpdates() { return Collections.<Update>singletonList(new UpdateSpy()); } }; String version = "TestVersion"; updater.setFitNesseVersion(version); File propertiesFile = new File("testDir/RooT/properties"); FileUtil.deleteFile(propertiesFile); assertFalse(propertiesFile.exists()); updater.update(); assertTrue(updateDone); assertTrue(propertiesFile.exists()); Properties properties = updater.loadProperties(); assertTrue(properties.containsKey("Version")); assertEquals(version, properties.get("Version")); FileUtil.deleteFile(propertiesFile); } @Test public void updatesShouldNotBeRunIfCurrentVersionAlreadyUpdated() throws Exception { updater = new WikiContentUpdater(context) { @Override List<Update> makeAllUpdates() { return Collections.<Update>singletonList(new UpdateSpy()); } }; String version = "TestVersion"; updater.setFitNesseVersion(version); Properties properties = updater.getProperties(); properties.put("Version", version); updater.update(); assertFalse(updateDone); } @Test(expected = RuntimeException.class) public void shouldThrowExceptionInNoUpdateFileExists() throws Exception { FileUtil.deleteFile(updateList); updater.parseResource("build/classes/test/Resources/updateList"); } @After public void tearDown() throws IOException { FileUtil.deleteFileSystemDirectory("build/classes/test/Resources"); FileUtil.deleteFileSystemDirectory(testDir); } private class UpdateSpy implements Update { @Override public String getName() { return "test"; } @Override public String getMessage() { return "test"; } @Override public boolean shouldBeApplied() { return true; } @Override public void doUpdate() { updateDone = true; } } }