// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.responders; import java.io.IOException; import util.RegexTestCase; import fitnesse.FitNesseContext; import fitnesse.authentication.OneUserAuthenticator; import fitnesse.http.ChunkedResponse; import fitnesse.http.MockChunkedDataProvider; import fitnesse.http.MockRequest; import fitnesse.http.MockResponseSender; import fitnesse.http.Response; import fitnesse.testutil.FitNesseUtil; import fitnesse.wiki.PageData; import fitnesse.wiki.WikiImportProperty; import fitnesse.wiki.WikiPage; import fitnesse.wiki.WikiPageDummy; import fitnesse.wiki.WikiPagePath; import fitnesse.wiki.WikiPageProperties; public class WikiImportingResponderTest extends RegexTestCase { private WikiImportingResponder responder; private String baseUrl; private WikiImporterTest testData; public void setUp() throws Exception { testData = new WikiImporterTest(); testData.createRemoteRoot(); testData.createLocalRoot(); FitNesseUtil.startFitnesse(testData.remoteRoot); baseUrl = "http://localhost:" + FitNesseUtil.port + "/"; createResponder(); } private void createResponder() throws Exception { responder = new WikiImportingResponder(); responder.path = new WikiPagePath(); ChunkedResponse response = new ChunkedResponse("html", new MockChunkedDataProvider()); response.sendTo(new MockResponseSender()); responder.setResponse(response); responder.getImporter().setDeleteOrphanOption(false); } public void tearDown() throws Exception { FitNesseUtil.stopFitnesse(); } public void testActionsOfMakeResponse() throws Exception { Response response = makeSampleResponse(baseUrl); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); assertEquals(2, testData.pageTwo.getChildren().size()); WikiPage importedPageOne = testData.pageTwo.getChildPage("PageOne"); assertNotNull(importedPageOne); assertEquals("page one", importedPageOne.getData().getContent()); WikiPage importedPageTwo = testData.pageTwo.getChildPage("PageTwo"); assertNotNull(importedPageTwo); assertEquals("page two", importedPageTwo.getData().getContent()); assertEquals(1, importedPageOne.getChildren().size()); WikiPage importedChildOne = importedPageOne.getChildPage("ChildOne"); assertNotNull(importedChildOne); assertEquals("child one", importedChildOne.getData().getContent()); } public void testImportingFromNonRootPageUpdatesPageContent() throws Exception { PageData data = testData.pageTwo.getData(); WikiImportProperty importProperty = new WikiImportProperty(baseUrl + "PageOne"); importProperty.addTo(data.getProperties()); data.setContent("nonsense"); testData.pageTwo.commit(data); Response response = makeSampleResponse("blah"); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); data = testData.pageTwo.getData(); assertEquals("page one", data.getContent()); assertFalse(WikiImportProperty.createFrom(data.getProperties()).isRoot()); } public void testImportPropertiesGetAdded() throws Exception { Response response = makeSampleResponse(baseUrl); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); checkProperties(testData.pageTwo, baseUrl, true, null); WikiPage importedPageOne = testData.pageTwo.getChildPage("PageOne"); checkProperties(importedPageOne, baseUrl + "PageOne", false, testData.remoteRoot.getChildPage("PageOne")); WikiPage importedPageTwo = testData.pageTwo.getChildPage("PageTwo"); checkProperties(importedPageTwo, baseUrl + "PageTwo", false, testData.remoteRoot.getChildPage("PageTwo")); WikiPage importedChildOne = importedPageOne.getChildPage("ChildOne"); checkProperties(importedChildOne, baseUrl + "PageOne.ChildOne", false, testData.remoteRoot.getChildPage("PageOne").getChildPage("ChildOne")); } private void checkProperties(WikiPage page, String source, boolean isRoot, WikiPage remotePage) throws Exception { WikiPageProperties props = page.getData().getProperties(); if (!isRoot) assertFalse("should not have Edit property", props.has("Edit")); WikiImportProperty importProperty = WikiImportProperty.createFrom(props); assertNotNull(importProperty); assertEquals(source, importProperty.getSourceUrl()); assertEquals(isRoot, importProperty.isRoot()); if (remotePage != null) { long remoteLastModificationTime = remotePage.getData().getProperties().getLastModificationTime().getTime(); long importPropertyLastModificationTime = importProperty.getLastRemoteModificationTime().getTime(); assertEquals(remoteLastModificationTime, importPropertyLastModificationTime); } } private String simulateWebRequest(MockRequest request) throws IOException { ChunkedResponse response = getResponse(request); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); return content; } public void testHtmlOfMakeResponse() throws IOException { Response response = makeSampleResponse(baseUrl); MockResponseSender sender = new MockResponseSender(); ((ChunkedResponse) response).turnOffChunking(); sender.doSending(response); String content = sender.sentData(); System.out.println(content); assertSubString("<html>", content); assertSubString("Wiki Import", content); assertSubString("PageTwo", content); assertSubString("PageTwo.PageOne", content); assertSubString("PageTwo.PageOne.ChildOne", content); assertSubString("Import complete.", content); assertSubString("3 pages were imported.", content); } public void testHtmlOfMakeResponseWithNoModifications() throws Exception { Response response = makeSampleResponse(baseUrl); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); // import a second time... nothing was modified createResponder(); response = makeSampleResponse(baseUrl); sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); assertSubString("<html>", content); assertSubString("Wiki Import", content); assertSubString("PageTwo", content); assertNotSubString("PageTwo.PageOne", content); assertNotSubString("href=\"PageTwo.PageOne.ChildOne\"", content); assertNotSubString("href=\"PageTwo.PageTwo\"", content); assertSubString("Import complete.", content); assertSubString("0 pages were imported.", content); assertSubString("3 pages were unmodified.", content); } private ChunkedResponse makeSampleResponse(String remoteUrl) { MockRequest request = makeRequest(remoteUrl); return getResponse(request); } private ChunkedResponse getResponse(MockRequest request) { ChunkedResponse response = (ChunkedResponse) responder.makeResponse(new FitNesseContext(testData.localRoot), request); response.turnOffChunking(); return response; } private MockRequest makeRequest(String remoteUrl) { MockRequest request = new MockRequest(); request.setResource("PageTwo"); request.addInput("responder", "import"); request.addInput("remoteUrl", remoteUrl); return request; } public void testMakeResponseImportingNonRootPage() throws Exception { MockRequest request = makeRequest(baseUrl + "PageOne"); Response response = responder.makeResponse(new FitNesseContext(testData.localRoot), request); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); assertNotNull(testData.pageTwo.getChildPage("ChildOne")); assertSubString("PageTwo.ChildOne", content); assertSubString("ChildOne", content); } public void testRemoteUrlNotFound() throws Exception { String remoteUrl = baseUrl + "PageDoesntExist"; Response response = makeSampleResponse(remoteUrl); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); assertSubString("The remote resource, " + remoteUrl + ", was not found.", content); } public void testErrorMessageForBadUrlProvided() throws Exception { String remoteUrl = baseUrl + "blah"; Response response = makeSampleResponse(remoteUrl); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); assertSubString("The URL's resource path, blah, is not a valid WikiWord.", content); } public void testUnauthorizedResponse() throws Exception { makeSecurePage(testData.remoteRoot); Response response = makeSampleResponse(baseUrl); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); checkRemoteLoginForm(content); } private void makeSecurePage(WikiPage page) throws Exception { PageData data = page.getData(); data.setAttribute(PageData.PropertySECURE_READ); page.commit(data); FitNesseUtil.context.authenticator = new OneUserAuthenticator("joe", "blow"); } private void checkRemoteLoginForm(String content) { assertHasRegexp("The wiki at .* requires authentication.", content); assertSubString("<form", content); assertHasRegexp("<input[^>]*name=\"remoteUsername\"", content); assertHasRegexp("<input[^>]*name=\"remotePassword\"", content); } public void testUnauthorizedResponseFromNonRoot() throws Exception { WikiPage childPage = testData.remoteRoot.getChildPage("PageOne"); makeSecurePage(childPage); Response response = makeSampleResponse(baseUrl); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); assertSubString("The wiki at " + baseUrl + "PageOne requires authentication.", content); assertSubString("<form", content); } public void testImportingFromSecurePageWithCredentials() throws Exception { makeSecurePage(testData.remoteRoot); MockRequest request = makeRequest(baseUrl); request.addInput("remoteUsername", "joe"); request.addInput("remotePassword", "blow"); Response response = getResponse(request); MockResponseSender sender = new MockResponseSender(); sender.doSending(response); String content = sender.sentData(); assertNotSubString("requires authentication", content); assertSubString("3 pages were imported.", content); assertEquals("joe", WikiImporter.remoteUsername); assertEquals("blow", WikiImporter.remotePassword); } public void testListOfOrphanedPages() throws Exception { WikiImporter importer = new WikiImporter(); responder.setImporter(importer); MockRequest request = makeRequest(baseUrl); String content = simulateWebRequest(request); assertNotSubString("orphan", content); //assertNotSubString("PageOne", content); //assertNotSubString("PageOne.ChildPagae", content); importer.getOrphans().add(new WikiPagePath(testData.pageOne)); importer.getOrphans().add(new WikiPagePath(testData.childPageOne)); content = simulateWebRequest(request); assertSubString("2 orphaned pages were found and have been removed.", content); assertSubString("PageOne", content); assertSubString("PageOne.ChildOne", content); } public void testAutoUpdatingTurnedOn() throws Exception { MockRequest request = makeRequest(baseUrl); responder.setRequest(request); responder.data = new PageData(new WikiPageDummy()); responder.initializeImporter(); assertFalse(responder.getImporter().getAutoUpdateSetting()); request.addInput("autoUpdate", "1"); responder.initializeImporter(); assertTrue(responder.getImporter().getAutoUpdateSetting()); } public void testAutoUpdateSettingDisplayed() throws Exception { WikiImporter importer = new MockWikiImporter(); responder.setImporter(importer); MockRequest request = makeRequest(baseUrl); request.addInput("autoUpdate", true); String content = simulateWebRequest(request); assertSubString("Automatic Update turned ON", content); request = makeRequest(baseUrl); content = simulateWebRequest(request); assertSubString("Automatic Update turned OFF", content); } }