// 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.refactoring;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static util.RegexTestCase.assertSubString;
import java.util.List;
import fitnesse.Responder;
import fitnesse.http.SimpleResponse;
import fitnesse.responders.ResponderTestCase;
import fitnesse.wiki.PageCrawler;
import fitnesse.wiki.PageData;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiPagePath;
import fitnesse.wiki.WikiPageUtil;
import org.junit.Before;
import org.junit.Test;
public class MovePageResponderTest extends ResponderTestCase {
private WikiPage pageOne;
private WikiPage pageA;
private WikiPage pageTwo;
private MovePageResponder moveResponder;
private PageCrawler crawler;
@Override
protected Responder responderInstance() {
return new MovePageResponder();
}
@Override
@Before
public void setUp() throws Exception {
super.setUp();
moveResponder = (MovePageResponder) responder;
pageOne = WikiPageUtil.addPage(root, PathParser.parse("PageOne"), "^PageA");
pageA = WikiPageUtil.addPage(pageOne, PathParser.parse("PageA"), "content");
pageTwo = WikiPageUtil.addPage(root, PathParser.parse("PageTwo"), "");
crawler = root.getPageCrawler();
}
@Test
public void testIsChildOf() throws Exception {
WikiPage parent = WikiPageUtil.addPage(root, PathParser.parse("TheParent"), "");
WikiPage child = WikiPageUtil.addPage(parent, PathParser.parse("TheChild"), "");
WikiPage grandChild = WikiPageUtil.addPage(child, PathParser.parse("TheGrandChild"), "");
assertIsAncestor(parent, child);
assertIsAncestor(parent, grandChild);
assertIsAncestor(parent, parent);
assertIsNotAncestor(child, parent);
assertIsNotAncestor(grandChild, parent);
}
private void assertIsNotAncestor(WikiPage supposedAncestor, WikiPage supposedDescendent) {
assertFalse(isAncestor(supposedAncestor, supposedDescendent));
}
private void assertIsAncestor(WikiPage expectedAncestor, WikiPage expectedDescendent) {
assertTrue(isAncestor(expectedAncestor, expectedDescendent));
}
private boolean isAncestor(WikiPage ancestor, WikiPage descendent) {
return moveResponder.pageIsAncestorOfNewParent(ancestor.getPageCrawler().getFullPath(),
descendent.getPageCrawler().getFullPath());
}
@Test
public void testMovePage() throws Exception {
PageData data = pageA.getData();
data.setAttribute("someAttribute", "someValue");
pageA.commit(data);
final String sourcePage = "PageOne.PageA";
final String destinationPage = "PageTwo.PageA";
final String destinationParent = "PageTwo";
assertTrue(crawler.pageExists(PathParser.parse(sourcePage)));
assertFalse(crawler.pageExists(PathParser.parse(destinationPage)));
movePage(sourcePage, destinationParent, true);
assertTrue(crawler.pageExists(PathParser.parse(destinationPage)));
assertFalse(crawler.pageExists(PathParser.parse(sourcePage)));
WikiPagePath destinationPath = PathParser.parse(destinationPage);
WikiPage movedPage = crawler.getPage(destinationPath);
data = movedPage.getData();
assertEquals("content", data.getContent());
assertEquals("someValue", data.getAttribute("someAttribute"));
}
private SimpleResponse movePage(String pageToMove, String newParent, boolean refactorReferences) throws Exception //todo RCM 2/8/05 Change all callers to use wikiPagePath version below.
{
request.addInput("newLocation", newParent);
request.setResource(pageToMove);
if (refactorReferences)
request.addInput("refactorReferences", "on");
return (SimpleResponse) responder.makeResponse(context, request);
}
private SimpleResponse movePage(WikiPagePath pageToMove, WikiPagePath newParent, boolean refactorReferences) throws Exception {
return movePage(PathParser.render(pageToMove), PathParser.render(newParent), refactorReferences);
}
@Test
public void testReferencesChanged() throws Exception {
movePage("PageOne.PageA", "PageTwo", true);
pageOne = root.getChildPage("PageOne");
assertEquals(".PageTwo.PageA", pageOne.getData().getContent());
}
@Test
public void testReferenceToSubPageChanged() throws Exception {
WikiPageUtil.addPage(root, PathParser.parse("ReferingPage"), "PageOne.PageA");
movePage("PageOne", "PageTwo", true);
WikiPage referingPage = root.getChildPage("ReferingPage");
assertEquals(".PageTwo.PageOne.PageA", referingPage.getData().getContent());
}
@Test
public void testReferenceToSubPageNotChangedWhenDisabled() throws Exception {
WikiPageUtil.addPage(root, PathParser.parse("ReferingPage"), "PageOne.PageA");
movePage("PageOne", "PageTwo", false);
WikiPage referingPage = root.getChildPage("ReferingPage");
assertEquals("PageOne.PageA", referingPage.getData().getContent());
}
@Test
public void testCantMoveToSelf() throws Exception {
pageA.getData().setAttribute("someAttribute", "someValue");
assertTrue(crawler.pageExists(PathParser.parse("PageOne.PageA")));
SimpleResponse response = movePage("PageOne.PageA", "PageOne", true);
assertSubString("Cannot move", response.getContent());
assertTrue(crawler.pageExists(PathParser.parse("PageOne.PageA")));
}
@Test
public void testCantReplaceExistingPage() throws Exception {
WikiPageUtil.addPage(pageTwo, PathParser.parse("PageA"), "someContent");
pageA.getData().setAttribute("someAttribute", "someValue");
assertTrue(crawler.pageExists(PathParser.parse("PageTwo.PageA")));
assertTrue(crawler.pageExists(PathParser.parse("PageOne.PageA")));
SimpleResponse response = movePage("PageOne.PageA", "PageTwo", true);
assertSubString("Cannot move", response.getContent());
assertEquals("someContent", pageTwo.getChildPage("PageA").getData().getContent());
assertEquals("content", pageA.getData().getContent());
assertTrue(crawler.pageExists(PathParser.parse("PageTwo.PageA")));
assertTrue(crawler.pageExists(PathParser.parse("PageOne.PageA")));
}
@Test
public void testChildrenGetMovedIfParentMoves() throws Exception {
final String sourceChildOne = "PageOne.PageA.ChildOne";
final String sourceChildTwo = "PageOne.PageA.ChildTwo";
final String sourceGrandChild = "PageOne.PageA.ChildTwo.ChildTwoDotOne";
final String parentToMove = "PageOne.PageA";
final String destinationParent = "PageTwo";
final String destinationPage = "PageTwo.PageA";
final String destinationChildOne = "PageTwo.PageA.ChildOne";
final String destinationChildTwo = "PageTwo.PageA.ChildTwo";
final String destinationGrandChild = "PageTwo.PageA.ChildTwo.ChildTwoDotOne";
WikiPagePath sourceChildOnePath = PathParser.parse(sourceChildOne);
WikiPagePath sourceChildTwoPath = PathParser.parse(sourceChildTwo);
WikiPagePath sourceGrandChildPath = PathParser.parse(sourceGrandChild);
WikiPagePath destinationPagePath = PathParser.parse(destinationPage);
WikiPagePath destinationChildOnePath = PathParser.parse(destinationChildOne);
WikiPagePath destinationChildTwoPath = PathParser.parse(destinationChildTwo);
WikiPagePath destinationGrandChildPath = PathParser.parse(destinationGrandChild);
WikiPageUtil.addPage(root, sourceChildOnePath, "child1Content");
WikiPageUtil.addPage(root, sourceChildTwoPath, "child2Content");
WikiPageUtil.addPage(root, sourceGrandChildPath, "");
movePage(parentToMove, destinationParent, true);
WikiPage movedPage = crawler.getPage(destinationPagePath);
assertFalse(crawler.pageExists(sourceChildOnePath));
assertFalse(crawler.pageExists(sourceChildTwoPath));
List<?> children = movedPage.getChildren();
assertEquals(2, children.size());
assertTrue(crawler.pageExists(destinationChildOnePath));
assertTrue(crawler.pageExists(destinationChildTwoPath));
assertTrue(crawler.pageExists(destinationGrandChildPath));
}
@Test
public void testCantMovePageBelowChild() throws Exception {
SimpleResponse response = movePage("PageOne", "PageOne.PageA", true);
assertSubString("Cannot move", response.getContent());
assertTrue(crawler.pageExists(PathParser.parse("PageOne.PageA")));
}
@Test
public void testMoveToRoot() throws Exception {
WikiPagePath originalPath = PathParser.parse("PageOne.PageA");
assertTrue(crawler.pageExists(originalPath));
movePage(originalPath, PathParser.parse(""), true);
WikiPage movedPage = root.getChildPage(pageA.getName());
assertFalse(crawler.pageExists(originalPath));
assertEquals("content", movedPage.getData().getContent());
assertEquals(PathParser.parse("PageA"), movedPage.getPageCrawler().getFullPath());
pageOne = root.getChildPage(pageOne.getName());
assertEquals(".PageA", pageOne.getData().getContent());
}
@Test
public void testMoveFromRoot() throws Exception {
assertTrue(crawler.pageExists(PathParser.parse("PageOne")));
movePage("PageOne", "PageTwo", true);
WikiPage movedPage = pageTwo.getChildPage("PageOne");
assertFalse(crawler.pageExists(PathParser.parse("PageOne")));
assertEquals(".PageTwo.PageOne.PageA", movedPage.getData().getContent());
assertEquals("PageTwo.PageOne", PathParser.render(movedPage.getPageCrawler().getFullPath()));
}
@Test
public void testRedirection() throws Exception {
String url = moveResponder.createRedirectionUrl(pageOne, pageA.getName());
assertEquals("PageOne.PageA", url);
url = moveResponder.createRedirectionUrl(root, pageA.getName());
assertEquals("PageA", url);
}
@Test
public void testBadMoveLocationName() throws Exception {
assertTrue(crawler.pageExists(PathParser.parse("PageOne.PageA")));
SimpleResponse response = movePage("PageOne.PageA", "NoSuchPage", true);
assertSubString("Cannot move", response.getContent());
assertTrue(crawler.pageExists(PathParser.parse("PageOne.PageA")));
}
@Test
public void testMovePageIntoItselfIsNotAllowed() throws Exception {
WikiPageUtil.addPage(root, PathParser.parse("TestPage"), "");
SimpleResponse response = movePage("TestPage", "TestPage", true);
assertFalse(crawler.pageExists(PathParser.parse("TestPage.TestPage")));
assertEquals(400, response.getStatus());
assertSubString("Cannot move", response.getContent());
}
}