blob: fc762802c2e5938aaee1f31c99788e105e020ddc [file] [log] [blame]
/*
JSPWiki - a JSP-based WikiWiki clone.
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
package com.ecyrd.jspwiki.xmlrpc;
import com.ecyrd.jspwiki.*;
import com.ecyrd.jspwiki.attachment.Attachment;
import junit.framework.*;
import java.util.*;
import org.apache.jspwiki.api.WikiPage;
import org.apache.xmlrpc.*;
import com.ecyrd.jspwiki.xmlrpc.RPCHandler;
public class RPCHandlerTest extends TestCase
{
TestEngine m_engine;
RPCHandler m_handler;
Properties m_props;
static final String NAME1 = "Test";
public RPCHandlerTest( String s )
{
super( s );
}
public void setUp()
throws Exception
{
m_props = new Properties();
m_props.load( TestEngine.findTestProperties() );
m_engine = new TestEngine( m_props );
m_handler = new RPCHandler();
WikiContext ctx = m_engine.getWikiContextFactory().newViewContext( m_engine.createPage("Dummy") );
m_handler.initialize( ctx );
}
public void tearDown()
{
TestEngine.deleteTestPage( NAME1 );
TestEngine.deleteAttachments( NAME1 );
TestEngine.emptyWorkDir();
}
public void testNonexistantPage()
{
try
{
m_handler.getPage( "NoSuchPage" );
fail("No exception for missing page.");
}
catch( XmlRpcException e )
{
assertEquals( "Wrong error code.", RPCHandler.ERR_NOPAGE, e.code );
}
}
public void testRecentChanges()
throws Exception
{
Date time = getCalendarTime( Calendar.getInstance().getTime() );
Vector previousChanges = m_handler.getRecentChanges( time );
m_engine.saveText( NAME1, "Foo" );
WikiPage directInfo = m_engine.getPage( NAME1 );
time = getCalendarTime( directInfo.getLastModified() );
Vector recentChanges = m_handler.getRecentChanges( time );
assertEquals( "wrong number of changes", 1, recentChanges.size() - previousChanges.size() );
}
public void testRecentChangesWithAttachments()
throws Exception
{
Date time = getCalendarTime( Calendar.getInstance().getTime() );
Vector previousChanges = m_handler.getRecentChanges( time );
m_engine.saveText( NAME1, "Foo" );
Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
att.setAuthor( "FirstPost" );
m_engine.getAttachmentManager().storeAttachment( att, m_engine.makeAttachmentFile() );
WikiPage directInfo = m_engine.getPage( NAME1 );
time = getCalendarTime( directInfo.getLastModified() );
Vector recentChanges = m_handler.getRecentChanges( time );
assertEquals( "wrong number of changes", 1, recentChanges.size() - previousChanges.size() );
}
public void testPageInfo()
throws Exception
{
m_engine.saveText( NAME1, "Foobar.[{ALLOW view Anonymous}]" );
WikiPage directInfo = m_engine.getPage( NAME1 );
Hashtable ht = m_handler.getPageInfo( NAME1 );
assertEquals( "name", (String)ht.get( "name" ), NAME1 );
Date d = (Date) ht.get( "lastModified" );
Calendar cal = Calendar.getInstance();
cal.setTime( d );
System.out.println("Real: "+directInfo.getLastModified() );
System.out.println("RPC: "+d );
// Offset the ZONE offset and DST offset away. DST only
// if we're actually in DST.
cal.add( Calendar.MILLISECOND,
(cal.get( Calendar.ZONE_OFFSET )+
(cal.getTimeZone().inDaylightTime( d ) ? cal.get( Calendar.DST_OFFSET ) : 0 ) ) );
System.out.println("RPC2: "+cal.getTime() );
assertEquals( "date", cal.getTime().getTime(),
directInfo.getLastModified().getTime() );
}
/**
* Tests if listLinks() works with a single, non-existant local page.
*/
public void testListLinks()
throws Exception
{
String text = "[Foobar]";
String pageName = NAME1;
m_engine.saveText( pageName, text );
Vector links = m_handler.listLinks( pageName );
assertEquals( "link count", 1, links.size() );
Hashtable linkinfo = (Hashtable) links.elementAt(0);
assertEquals( "name", "Foobar", linkinfo.get("page") );
assertEquals( "type", "local", linkinfo.get("type") );
assertEquals( "href", "http://localhost/Edit.jsp?page=Foobar", linkinfo.get("href") );
}
public void testListLinksWithAttachments()
throws Exception
{
String text = "[Foobar] [Test/TestAtt.txt]";
String pageName = NAME1;
m_engine.saveText( pageName, text );
Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
att.setAuthor( "FirstPost" );
m_engine.getAttachmentManager().storeAttachment( att, m_engine.makeAttachmentFile() );
// Test.
Vector links = m_handler.listLinks( pageName );
assertEquals( "link count", 2, links.size() );
Hashtable linkinfo = (Hashtable) links.elementAt(0);
assertEquals( "edit name", "Foobar", linkinfo.get("page") );
assertEquals( "edit type", "local", linkinfo.get("type") );
assertEquals( "edit href", "http://localhost/Edit.jsp?page=Foobar", linkinfo.get("href") );
linkinfo = (Hashtable) links.elementAt(1);
assertEquals( "att name", NAME1+"/TestAtt.txt", linkinfo.get("page") );
assertEquals( "att type", "local", linkinfo.get("type") );
assertEquals( "att href", "http://localhost/attach/"+NAME1+"/TestAtt.txt", linkinfo.get("href") );
}
private Date getCalendarTime( Date modifiedDate )
{
Calendar cal = Calendar.getInstance();
cal.setTime( modifiedDate );
cal.add( Calendar.HOUR, -1 );
// Go to UTC
// Offset the ZONE offset and DST offset away. DST only
// if we're actually in DST.
cal.add( Calendar.MILLISECOND,
-(cal.get( Calendar.ZONE_OFFSET )+
(cal.getTimeZone().inDaylightTime( modifiedDate ) ? cal.get( Calendar.DST_OFFSET ) : 0 ) ) );
return cal.getTime();
}
/*
* TODO: ENABLE
public void testPermissions()
throws Exception
{
String text ="Blaa. [{DENY view Guest}] [{ALLOW view NamedGuest}]";
m_engine.saveText( NAME1, text );
try
{
Vector links = m_handler.listLinks( NAME1 );
fail("Didn't get an exception in listLinks()");
}
catch( XmlRpcException e ) {}
try
{
Hashtable ht = m_handler.getPageInfo( NAME1 );
fail("Didn't get an exception in getPageInfo()");
}
catch( XmlRpcException e ) {}
}
*/
public static Test suite()
{
return new TestSuite( RPCHandlerTest.class );
}
}