// 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 static util.RegexTestCase.*;
import fitnesse.FitNesseContext;
import fitnesse.Responder;
import fitnesse.components.SaveRecorder;
import fitnesse.http.MockRequest;
import fitnesse.http.MockResponseSender;
import fitnesse.http.Response;
import fitnesse.http.SimpleResponse;
import fitnesse.testutil.FitNesseUtil;
import fitnesse.wiki.InMemoryPage;
import fitnesse.wiki.PageCrawler;
import fitnesse.wiki.PageData;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
import org.apache.tools.ant.PropertyHelper;
import org.junit.Before;
import org.junit.After;
import org.junit.Test;
public class SaveResponderTest {
private WikiPage root;
private Response response;
public MockRequest request;
public Responder responder;
private PageCrawler crawler;
@Before
public void setUp() throws Exception {
root = InMemoryPage.makeRoot("RooT");
FitNesseUtil.makeTestContext(root);
crawler = root.getPageCrawler();
request = new MockRequest();
responder = new SaveResponder();
SaveResponder.contentFilter = null;
SaveRecorder.clear();
}
@After
public void tearDown() throws Exception {
SaveResponder.contentFilter = null;
}
@Test
public void testResponse() throws Exception {
crawler.addPage(root, PathParser.parse("ChildPage"));
prepareRequest("ChildPage");
Response response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(303, response.getStatus());
assertHasRegexp("Location: ChildPage", response.makeHttpHeaders());
String newContent = root.getChildPage("ChildPage").getData().getContent();
assertEquals("some new content", newContent);
checkRecentChanges(root, "ChildPage");
}
private void prepareRequest(String pageName) {
request.setResource(pageName);
request.addInput(EditResponder.TIME_STAMP, "12345");
request.addInput(EditResponder.CONTENT_INPUT_NAME, "some new content");
request.addInput(EditResponder.HELP_TEXT, "some help");
request.addInput(EditResponder.TICKET_ID, "" + SaveRecorder.newTicket());
}
@Test
public void testResponseWithRedirect() throws Exception {
crawler.addPage(root, PathParser.parse("ChildPage"));
prepareRequest("ChildPage");
request.addInput("redirect", "http://fitnesse.org:8080/SomePage");
Response response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(303, response.getStatus());
assertHasRegexp("Location: http://fitnesse.org:8080/SomePage", response.makeHttpHeaders());
}
private void checkRecentChanges(WikiPage source, String changedPage) throws Exception {
assertTrue("RecentChanges should exist", source.hasChildPage("RecentChanges"));
String recentChanges = source.getChildPage("RecentChanges").getData().getContent();
assertTrue("ChildPage should be in RecentChanges", recentChanges.indexOf(changedPage) != -1);
}
@Test
public void testCanCreatePage() throws Exception {
prepareRequest("ChildPageTwo");
responder.makeResponse(new FitNesseContext(root), request);
assertEquals(true, root.hasChildPage("ChildPageTwo"));
String newContent = root.getChildPage("ChildPageTwo").getData().getContent();
assertEquals("some new content", newContent);
assertTrue("RecentChanges should exist", root.hasChildPage("RecentChanges"));
checkRecentChanges(root, "ChildPageTwo");
}
@Test
public void testCanCreatePageWithoutTicketIdAndEditTime() throws Exception {
request.setResource("ChildPageTwo");
request.addInput(EditResponder.CONTENT_INPUT_NAME, "some new content");
request.addInput(EditResponder.HELP_TEXT, "some help");
request.addInput(EditResponder.SUITES, "some help");
responder.makeResponse(new FitNesseContext(root), request);
assertEquals(true, root.hasChildPage("ChildPageTwo"));
String newContent = root.getChildPage("ChildPageTwo").getData().getContent();
assertEquals("some new content", newContent);
assertEquals("some help", root.getChildPage("ChildPageTwo").getData().getAttribute("Help"));
assertTrue("RecentChanges should exist", root.hasChildPage("RecentChanges"));
checkRecentChanges(root, "ChildPageTwo");
}
@Test
public void testKnowsWhenToMerge() throws Exception {
String simplePageName = "SimplePageName";
createAndSaveANewPage(simplePageName);
request.setResource(simplePageName);
request.addInput(EditResponder.CONTENT_INPUT_NAME, "some new content");
request.addInput(EditResponder.TIME_STAMP, "" + (SaveRecorder.timeStamp() - 10000));
request.addInput(EditResponder.TICKET_ID, "" + SaveRecorder.newTicket());
SimpleResponse response = (SimpleResponse) responder.makeResponse(new FitNesseContext(root), request);
assertHasRegexp("Merge", response.getContent());
}
@Test
public void testKnowWhenNotToMerge() throws Exception {
String pageName = "NewPage";
createAndSaveANewPage(pageName);
String newContent = "some new Content work damn you!";
request.setResource(pageName);
request.addInput(EditResponder.CONTENT_INPUT_NAME, newContent);
request.addInput(EditResponder.TIME_STAMP, "" + SaveRecorder.timeStamp());
request.addInput(EditResponder.TICKET_ID, "" + SaveRecorder.newTicket());
Response response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(303, response.getStatus());
request.addInput(EditResponder.CONTENT_INPUT_NAME, newContent + " Ok I'm working now");
request.addInput(EditResponder.TIME_STAMP, "" + SaveRecorder.timeStamp());
response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(303, response.getStatus());
}
@Test
public void testUsernameIsSavedInPageProperties() throws Exception {
addRequestParameters();
request.setCredentials("Aladdin", "open sesame");
response = responder.makeResponse(new FitNesseContext(root), request);
String user = root.getChildPage("EditPage").getData().getAttribute(PageData.LAST_MODIFYING_USER);
assertEquals("Aladdin", user);
}
@Test
public void testContentFilter() throws Exception {
SaveResponder.contentFilter = new ContentFilter() {
public boolean isContentAcceptable(String content, String page) {
return false;
}
};
crawler.addPage(root, PathParser.parse("ChildPage"));
prepareRequest("ChildPage");
Response response = responder.makeResponse(new FitNesseContext(root), request);
assertEquals(200, response.getStatus());
MockResponseSender sender = new MockResponseSender();
sender.doSending(response);
assertSubString("Your changes will not be saved!", sender.sentData());
}
private void createAndSaveANewPage(String pageName) throws Exception {
WikiPage simplePage = crawler.addPage(root, PathParser.parse(pageName));
PageData data = simplePage.getData();
SaveRecorder.pageSaved(data, 0);
simplePage.commit(data);
}
private void doSimpleEdit() throws Exception {
crawler.addPage(root, PathParser.parse("EditPage"));
addRequestParameters();
response = responder.makeResponse(new FitNesseContext(root), request);
}
private void addRequestParameters() {
prepareRequest("EditPage");
}
@Test
public void testHasVersionHeader() throws Exception {
doSimpleEdit();
assertTrue("header missing", response.getHeader("Previous-Version") != null);
}
}