// 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.editing;
import util.FileUtil;
import util.RegexTestCase;
import fitnesse.FitNesseContext;
import fitnesse.Responder;
import fitnesse.http.MockRequest;
import fitnesse.http.Response;
import fitnesse.http.SimpleResponse;
import fitnesse.wiki.FileSystemPage;
import fitnesse.wiki.InMemoryPage;
import fitnesse.wiki.PageData;
import fitnesse.wiki.SymbolicPage;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiPageProperty;
public class SymbolicLinkResponderTest extends RegexTestCase {
private WikiPage root;
private WikiPage pageOne, pageTwo, childTwo;
private MockRequest request;
private Responder responder;
public void setUp() throws Exception {
root = InMemoryPage.makeRoot("RooT"); //# root
pageOne = root.addChildPage("PageOne"); //# |--PageOne
pageOne.addChildPage("ChildOne"); //# | `--ChildOne
pageTwo = root.addChildPage("PageTwo"); //# `--PageTwo
childTwo = pageTwo.addChildPage("ChildTwo"); //# |--ChildTwo
pageTwo.addChildPage("ChildThree"); //# `--ChildThree
request = new MockRequest();
request.setResource("PageOne");
responder = new SymbolicLinkResponder();
}
public void tearDown() throws Exception {
FileUtil.deleteFileSystemDirectory("testDir");
}
public void testSubmitGoodForm() throws Exception {
executeSymbolicLinkTestWith("SymLink", "PageTwo");
}
public void testShouldTrimSpacesOnLinkPath() throws Exception {
executeSymbolicLinkTestWith("SymLink", " PageTwo ");
}
public void testShouldTrimSpacesOnLinkName() throws Exception {
executeSymbolicLinkTestWith(" SymLink ", "PageTwo");
}
private void executeSymbolicLinkTestWith(String linkName, String linkPath) throws Exception {
request.addInput("linkName", linkName);
request.addInput("linkPath", linkPath);
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkPageOneRedirectToProperties(response);
WikiPage symLink = pageOne.getChildPage("SymLink");
assertNotNull(symLink);
assertEquals(SymbolicPage.class, symLink.getClass());
}
public void testSubmitGoodFormToSiblingChild() throws Exception {
executeSymbolicLinkTestWith("SymLink", "PageTwo.ChildTwo");
}
public void testSubmitGoodFormToChildSibling() throws Exception {
request.setResource("PageTwo.ChildTwo");
request.addInput("linkName", "SymLink");
request.addInput("linkPath", "ChildThree");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkChildTwoRedirectToProperties(response);
WikiPage symLink = childTwo.getChildPage("SymLink");
assertNotNull(symLink);
assertEquals(SymbolicPage.class, symLink.getClass());
}
public void testSubmitGoodFormToAbsolutePath() throws Exception {
request.addInput("linkName", "SymLink");
request.addInput("linkPath", ".PageTwo");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkPageOneRedirectToProperties(response);
WikiPage symLink = pageOne.getChildPage("SymLink");
assertNotNull(symLink);
assertEquals(SymbolicPage.class, symLink.getClass());
}
public void testSubmitGoodFormToSubChild() throws Exception {
request.addInput("linkName", "SymLink");
request.addInput("linkPath", ">ChildOne");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkPageOneRedirectToProperties(response);
SymbolicPage symLink = (SymbolicPage) (pageOne.getChildPage("SymLink"));
assertNotNull(symLink);
assertEquals(SymbolicPage.class, symLink.getClass());
}
public void testSubmitGoodFormToSibling() throws Exception {
request.addInput("linkName", "SymTwo");
request.addInput("linkPath", "PageTwo");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkPageOneRedirectToProperties(response);
WikiPage symLink = pageOne.getChildPage("SymTwo");
assertNotNull(symLink);
assertEquals(SymbolicPage.class, symLink.getClass());
}
public void testSubmitGoodFormToBackwardRelative() throws Exception {
request.setResource("PageTwo.ChildTwo");
request.addInput("linkName", "SymLink");
request.addInput("linkPath", "<PageTwo.ChildThree");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkChildTwoRedirectToProperties(response);
WikiPage symLink = childTwo.getChildPage("SymLink");
assertNotNull(symLink);
assertEquals(SymbolicPage.class, symLink.getClass());
}
public void testRemoval() throws Exception {
PageData data = pageOne.getData();
WikiPageProperty symLinks = data.getProperties().set(SymbolicPage.PROPERTY_NAME);
symLinks.set("SymLink", "PageTwo");
pageOne.commit(data);
assertNotNull(pageOne.getChildPage("SymLink"));
request.addInput("removal", "SymLink");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkPageOneRedirectToProperties(response);
assertNull(pageOne.getChildPage("SymLink"));
}
public void testRename() throws Exception {
PageData data = pageOne.getData();
WikiPageProperty symLinks = data.getProperties().set(SymbolicPage.PROPERTY_NAME);
symLinks.set("SymLink", "PageTwo");
pageOne.commit(data);
assertNotNull(pageOne.getChildPage("SymLink"));
request.addInput("rename", "SymLink");
request.addInput("newname", "NewLink");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkPageOneRedirectToProperties(response);
assertNotNull(pageOne.getChildPage("NewLink"));
}
public void testNoPageAtPath() throws Exception {
request.addInput("linkName", "SymLink");
request.addInput("linkPath", "NonExistingPage");
Response response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(404, response.getStatus());
String content = ((SimpleResponse) response).getContent();
assertSubString("doesn't exist", content);
assertSubString("Error Occured", content);
}
public void testAddFailWhenPageAlreadyHasChild() throws Exception {
pageOne.addChildPage("SymLink");
request.addInput("linkName", "SymLink");
request.addInput("linkPath", "PageTwo");
Response response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(412, response.getStatus());
String content = ((SimpleResponse) response).getContent();
assertSubString("already has a child named SymLink", content);
assertSubString("Error Occured", content);
}
public void testSubmitFormForLinkToExternalRoot() throws Exception {
FileUtil.createDir("testDir");
FileUtil.createDir("testDir/ExternalRoot");
request.addInput("linkName", "SymLink");
request.addInput("linkPath", "file://testDir/ExternalRoot");
Response response = responder.makeResponse(new FitNesseContext(root), request);
checkPageOneRedirectToProperties(response);
WikiPage symLink = pageOne.getChildPage("SymLink");
assertNotNull(symLink);
assertEquals(SymbolicPage.class, symLink.getClass());
WikiPage realPage = ((SymbolicPage) symLink).getRealPage();
assertEquals(FileSystemPage.class, realPage.getClass());
assertEquals("testDir/ExternalRoot", ((FileSystemPage) realPage).getFileSystemPath());
}
public void testSubmitFormForLinkToExternalRootThatsMissing() throws Exception {
request.addInput("linkName", "SymLink");
request.addInput("linkPath", "file://testDir/ExternalRoot");
Response response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(404, response.getStatus());
String content = ((SimpleResponse) response).getContent();
assertSubString("Cannot create link to the file system path, <b>file://testDir/ExternalRoot</b>.", content);
assertSubString("Error Occured", content);
}
private void checkPageOneRedirectToProperties(Response response) {
assertEquals(303, response.getStatus());
assertEquals(response.getHeader("Location"), "PageOne?properties");
}
private void checkChildTwoRedirectToProperties(Response response) {
assertEquals(303, response.getStatus());
assertEquals(response.getHeader("Location"), "PageTwo.ChildTwo?properties");
}
}