package fitnesse.revisioncontrol.responders; import fitnesse.FitNesseContext; import fitnesse.html.HtmlTag; import fitnesse.http.MockRequest; import fitnesse.revisioncontrol.NullState; import fitnesse.revisioncontrol.OperationStatus; import fitnesse.revisioncontrol.RevisionControlOperation; import fitnesse.revisioncontrol.RevisionController; import fitnesse.revisioncontrol.wiki.RevisionControlledFileSystemPage; import fitnesse.wiki.*; import java.util.Map; import static org.easymock.EasyMock.*; public class RevisionControlResponderTest extends RevisionControlTestCase { private final String revisionControlOperation = "Test Revision Control Operation"; private static final String pageName = "SomePage"; @Override protected void setUp() throws Exception { super.setUp(); this.root = InMemoryPage.makeRoot("RooT"); this.context = new FitNesseContext(this.root); this.request = new MockRequest(); this.responder = new TestRevisionControlResponder(); } public void testShouldReturnPageNotFoundMessageWhenPageDoesNotExist() throws Exception { replay(this.revisionController); final String pageName = "InvalidPageName"; this.request.setResource(pageName); invokeResponderAndCheckResponseContains("The requested resource: <i>" + pageName + "</i> was not found."); } public void testShouldReturnInvalidWikiPageMessageIfWikiPageDoesNotExistOnFileSystem() throws Exception { replay(this.revisionController); final String inMemoryPageName = "InMemoryPage"; this.root.addChildPage(inMemoryPageName); this.request.setResource(inMemoryPageName); invokeResponderAndCheckResponseContains("The page " + inMemoryPageName + " doesn't support '" + this.revisionControlOperation + "' operation."); } public void testShouldResolveSymbolicLinkToActualPageAndApplyRevisionControlOperations() throws Exception { replay(this.revisionController); final String symbolicLinkName = "SymbolicLink"; final String pageOneName = "PageOne"; final String symbolicLinkPageName = pageOneName + "." + symbolicLinkName; createSymbolicLink(symbolicLinkName, pageOneName); this.request.setResource(symbolicLinkPageName); invokeResponderAndCheckResponseContains("The page " + symbolicLinkPageName + " doesn't support '" + this.revisionControlOperation + "' operation."); } public void testShouldReportPerformRevisionControlOperation() throws Exception { final String expectedResponse1 = "Attempted to '" + this.revisionControlOperation + "' the page '" + pageName + "'."; final String expectedResponse2 = this.revisionControlOperation + " was successful."; this.revisionController = createNiceMock(RevisionController.class); expect(this.revisionController.getState((String) anyObject())).andStubReturn(NullState.UNKNOWN); replay(this.revisionController); createExternalRoot(); this.root.getPageCrawler().addPage(this.root, PathParser.parse(pageName), "Test Page Content"); this.request.setResource(pageName); invokeResponderAndCheckResponseContains(expectedResponse1, expectedResponse2); verify(this.revisionController); } private void createSymbolicLink(final String symbolicLinkName, final String pageOneName) throws Exception { final String pageTwoName = "PageTwo"; final WikiPage pageOne = this.root.addChildPage(pageOneName); this.root.addChildPage(pageTwoName); final PageData data = pageOne.getData(); final WikiPageProperties properties = data.getProperties(); final WikiPageProperty symLinks = getSymLinkProperty(properties); symLinks.set(symbolicLinkName, pageTwoName); pageOne.commit(data); } private WikiPageProperty getSymLinkProperty(final WikiPageProperties properties) { return properties.set(SymbolicPage.PROPERTY_NAME); } private class TestRevisionControlResponder extends RevisionControlResponder { public TestRevisionControlResponder() { super(new RevisionControlOperation(RevisionControlResponderTest.this.revisionControlOperation, "", "") { @Override public Object execute(RevisionController revisionController, String pagePath, Map args) { return OperationStatus.SUCCESS; } }); } @Override protected String createPageLink(final String resource) throws Exception { return "End of operation."; } @Override protected void performOperation(final RevisionControlledFileSystemPage page, HtmlTag tag) { } } }