package dw.xmlrpc.itest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TimeZone; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import dw.xmlrpc.DokuJClient; import dw.xmlrpc.DokuJClientConfig; import dw.xmlrpc.LinkInfo; import dw.xmlrpc.Page; import dw.xmlrpc.PageChange; import dw.xmlrpc.PageDW; import dw.xmlrpc.PageInfo; import dw.xmlrpc.PageVersion; import dw.xmlrpc.SearchResult; import dw.xmlrpc.exception.DokuException; import dw.xmlrpc.exception.DokuUnauthorizedException; @RunWith(value = Parameterized.class) public class Test_XmlRpcQueries extends TestHelper { private DokuJClient _client; private DokuJClient _clientWriter; private TestParams _params; public Test_XmlRpcQueries(TestParams params) throws MalformedURLException, DokuException{ _params = params; _client = new DokuJClient(params.url, TestParams.user, TestParams.password); _clientWriter = new DokuJClient(params.url, TestParams.writerLogin, TestParams.writerPwd); TimeZone.setDefault(TimeZone.getTimeZone("GMT")); } @Parameters public static Collection<Object[]> data() { return TestParams.data(); } @org.junit.Test public void builtWithAConfig() throws Exception { DokuJClientConfig config = new DokuJClientConfig(_params.url); config.setUser(TestParams.user, TestParams.password); DokuJClient client = new DokuJClient(config); assertEquals(_params.wikiVersion, client.getVersion()); } @org.junit.Test public void getVersion() throws Exception { assertEquals(_params.wikiVersion, _client.getVersion()); } @org.junit.Test public void getPageInfo() throws Exception { String pageId = "rev:start"; PageInfo pageInfo = _client.getPageInfo(pageId); assertEquals(pageId, pageInfo.id()); assertEquals("lulu", pageInfo.author()); assertEquals((Integer) 1356218419, pageInfo.version()); assertDatesNear(2012, 11, 22, 23, 20, 19, pageInfo.modified()); } @org.junit.Test public void getPageInfoVersion() throws Exception { String pageId = "rev:start"; Integer version = 1356218411; PageInfo pageInfo = _client.getPageInfoVersion(pageId, version); assertEquals(pageId, pageInfo.id()); assertEquals("fifi", pageInfo.author()); assertEquals(version, pageInfo.version()); assertDatesNear(2012, 11, 22, 23, 20, 11, pageInfo.modified()); } @org.junit.Test public void getPageVersions() throws Exception{ String pageId = "rev:start"; List<PageVersion> versions = _client.getPageVersions(pageId, 0); PageVersion version = versions.get(0); assertEquals((Integer) 1356218419, version.version()); assertEquals(pageId, version.pageId()); assertEquals("127.0.0.1", version.ip()); assertEquals("E", version.type()); assertEquals("lulu", version.author()); assertEquals("edit 2", version.summary()); assertDatesNear(2012, 11, 22, 23, 20, 19, version.modified()); } @org.junit.Test public void getPageVersionsWithOffset() throws Exception{ String pageId = "rev:start"; List<PageVersion> versions1 = _client.getPageVersions(pageId, 1); PageVersion version1 = versions1.get(0); assertEquals((Integer) 1356218411, version1.version()); assertEquals(pageId, version1.pageId()); assertEquals("127.0.0.1", version1.ip()); assertEquals("E", version1.type()); assertEquals("fifi", version1.author()); assertEquals("edit 1", version1.summary()); assertDatesNear(2012, 11, 22, 23, 20, 19, version1.modified()); List<PageVersion> versions2 = _client.getPageVersions(pageId, 2); PageVersion version2 = versions2.get(0); assertEquals((Integer) 1356218400, version2.version()); assertEquals(pageId, version2.pageId()); assertEquals("127.0.0.1", version2.ip()); assertEquals("C", version2.type()); assertEquals("riri", version2.author()); assertEquals("created", version2.summary()); assertDatesNear(2012, 11, 22, 23, 20, 19, version2.modified()); } @org.junit.Test public void getPageVersion() throws Exception { String pageId = "rev:start"; assertEquals("version 1", _client.getPageVersion(pageId, 1356218400)); assertEquals("", _client.getPageVersion(pageId, 1356218401)); assertEquals("v2", _client.getPageVersion(pageId, 1356218411)); assertEquals("3rd version", _client.getPageVersion(pageId, 1356218419)); } @org.junit.Test public void getRecentChanges() throws Exception { List<PageChange> changes = _client.getRecentChanges(1356218401); assertTrue(changes.size() > 0); PageChange change = changes.get(0); assertEquals("someuser", change.author()); assertEquals((Integer) 1356218419, change.version()); assertEquals("rev:start", change.pageId()); assertEquals((Integer) 255, change.perms()); assertEquals((Integer) 11, change.size()); assertDatesNear(2012, 11, 22, 23, 20, 19, change.lastModified()); } @org.junit.Test public void getRecentChangesRespectMaxTimestamp() throws Exception { List<PageChange> changes = _client.getRecentChanges(1356218401); String pageId = "rev:start"; assertTrue(hasPageChangeOnce(changes, pageId)); changes = _client.getRecentChanges(1356218500); assertFalse(hasPageChangeOnce(changes, pageId)); } @org.junit.Test public void handlesTimestampsWithoutChange() throws Exception { assertEquals(0, _client.getRecentChanges(2000000000).size()); } @org.junit.Test public void getRecentChangesRespectMaxDate() throws Exception { List<PageChange> changes = _client.getRecentChanges(buildDate(2012, 11, 20, 0, 0, 0)); String pageId = "rev:start"; assertTrue(hasPageChangeOnce(changes, pageId)); changes = _client.getRecentChanges(buildDate(2013, 0, 1, 0, 0, 0)); assertFalse(hasPageChangeOnce(changes, pageId)); } private boolean hasPageChangeOnce(List<PageChange> changes, String pageId){ boolean foundChange = false; for(PageChange change : changes){ if ( change.pageId().equals(pageId) ){ if ( foundChange ){ fail("Had several PageChange for page " + pageId); } foundChange = true; } } return foundChange; } @org.junit.Test public void aclCheck() throws Exception { assertEquals((Integer) 255, _client.aclCheck("ns1:start")); assertEquals((Integer) 8, _clientWriter.aclCheck("ns1:start")); } @org.junit.Test public void getRPCVersionSupported() throws Exception { assertEquals(_params.rpcVersionSupported, _client.getRPCVersionSupported()); } @org.junit.Test public void getXMLRPCAPIVersion() throws Exception { assertEquals(_params.apiVersion, _client.getXMLRPCAPIVersion()); } @org.junit.Test public void time() throws Exception { //We proceed as follow to avoid having to use Sleep: // * edit a page to update its modification time and retrieve it // * retrieve server time // * edit the page again and retrieve // * make sure times are consistent PageDW page = _client.getPagelist("singlePage").get(0); _client.putPage(page.id(), "text before (time test)"); page = _client.getPagelist("singlePage").get(0); Integer timeBefore = page.mtime(); Integer serverTime = _client.getTime(); _client.putPage(page.id(), "text after (time test)"); page = _client.getPagelist("singlePage").get(0); Integer timeAfter = page.mtime(); assertTrue(0 < timeBefore); assertTrue(timeBefore <= serverTime); assertTrue(serverTime <= timeAfter); } @org.junit.Test public void getPagelistInAFlatNamespace() throws Exception { List<String> expectedPages = new ArrayList<String>(); expectedPages.add("ns1:start"); expectedPages.add("ns1:dummy"); List<PageDW> actualPages = _client.getPagelist("ns1"); assertEquals(expectedPages.size(), actualPages.size()); for (PageDW page : actualPages) { assertTrue(expectedPages.contains(page.id())); } } @org.junit.Test public void getPagelistCorrectlyBuildsPages() throws Exception{ String namespace = "nswithanotherns:otherns"; List<PageDW> pages = _client.getPagelist(namespace); assertEquals(1, pages.size()); PageDW page = pages.get(0); assertEquals(namespace + ":page", page.id()); assertEquals((Integer) 4, page.size()); assertEquals((Integer) 1375372800, page.version()); assertEquals((Integer) 1375372800, page.mtime()); assertEquals("71860c77c6745379b0d44304d66b6a13", page.hash()); } @org.junit.Test public void getPagelistInANamespaceWithAnotherNamespace() throws Exception { // Check we get every pages with no max recursion level Set<String> expectedPages = new HashSet<String>(); expectedPages.add("nswithanotherns:start"); expectedPages.add("nswithanotherns:dummy"); expectedPages.add("nswithanotherns:otherns:page"); HashMap<String, Object> options = new HashMap<String, Object>(); List<PageDW> actualPages = _client.getPagelist("nswithanotherns", options); assertEquals(expectedPages.size(), actualPages.size()); for (PageDW page : actualPages) { assertTrue(expectedPages.contains(page.id())); } // And now makes sure we can limit this recursion level expectedPages = new HashSet<String>(); expectedPages.add("nswithanotherns:start"); expectedPages.add("nswithanotherns:dummy"); options.put("depth", "2"); actualPages = _client.getPagelist("nswithanotherns", options); assertEquals(expectedPages.size(), actualPages.size()); for (PageDW page : actualPages) { assertTrue(expectedPages.contains(page.id())); } } @org.junit.Test public void genericQueryWithParameters() throws Exception { Object[] params = new Object[] { "ns1:start" }; //255 because we make the query as an admin assertEquals(255, _client.genericQuery("wiki.aclCheck", params)); } @org.junit.Test public void genericQueryWithoutParameters() throws Exception { assertEquals(_params.wikiVersion, _client.genericQuery("dokuwiki.getVersion")); } @org.junit.Test public void getTitle() throws Exception { assertEquals(TestParams.wikiTitle, _client.getTitle()); } @org.junit.Test public void putAndGetPage() throws Exception { String pageId = "ns1:dummy"; String content1 = "content1"; String content2 = "content2"; _client.putPage(pageId, content1); assertEquals(content1, _client.getPage(pageId)); _client.putPage(pageId, content2); assertEquals(content2, _client.getPage(pageId)); } @org.junit.Test public void appendPage() throws Exception { String pageId = "ns1:dummy"; String initialContent = "put page in a clean state."; String append1 = "text appended."; String append2 = "final text"; _client.putPage(pageId, initialContent); _client.appendPage(pageId, append1); assertEquals(initialContent + append1, _client.getPage(pageId)); _client.appendPage(pageId, append2); assertEquals(initialContent + append1 + append2, _client.getPage(pageId)); } @org.junit.Test public void editWithSummary() throws Exception { String pageId = "ns1:dummy"; String initialContent = _client.getPage(pageId); String addedContent = "def"; String addedSummary = "sum append"; String finalContent = "abc"; String finalSummary = "sum put"; //Start with appendPage, to make sure we change the content of the page //hence, that the modification is taken into account _client.appendPage(pageId, addedContent, addedSummary, false); assertEquals(initialContent + addedContent, _client.getPage(pageId)); //Because DW creates at most one revision per second //If we don't sleep here the next modification will override the previous one Thread.sleep(1000, 0); _client.putPage(pageId, finalContent, finalSummary, false); assertEquals(finalContent, _client.getPage(pageId)); List<PageVersion> versions = _client.getPageVersions(pageId); assertEquals(finalSummary, versions.get(0).summary()); assertEquals(addedSummary, versions.get(1).summary()); } @org.junit.Test public void getPageHTML() throws Exception { String pageId = "rev:start"; assertEquals("\n<p>\n3rd version\n</p>\n", _client.getPageHTML(pageId)); } @org.junit.Test public void getPageHTMLVersion() throws Exception{ String pageId = "rev:start"; Integer version = 1356218411; assertEquals("\n<p>\nv2\n</p>\n", _client.getPageHTMLVersion(pageId, version)); } @org.junit.Test public void listLinks() throws Exception{ List<LinkInfo> links = _client.listLinks("links:start"); LinkInfo link0 = new LinkInfo(LinkInfo.Type.extern, "http://dokuwiki.org", "http://dokuwiki.org"); LinkInfo link1 = new LinkInfo(LinkInfo.Type.extern, "http://github.com/gturri", "http://github.com/gturri"); LinkInfo link2 = new LinkInfo(LinkInfo.Type.local, "ns1:dummy","/" + _params.localPath + "/doku.php?id=ns1:dummy" ); assertEquals(link0, links.get(0)); assertEquals(link1, links.get(1)); assertEquals(link2, links.get(2)); } @org.junit.Test public void getBackLinks() throws Exception{ List<String> links = _client.getBackLinks("ns1:dummy"); assertEquals("links:start", links.get(0)); } @org.junit.Test public void getAllPages() throws Exception{ List<Page> pages = _client.getAllPages(); //Not an Equals assertion because other tests may create new pages assertTrue(pages.size() >= 11); //We check thoroughly an arbitrary page String pageId = "nssearch:page3"; Page page = null; for(Page p : pages){ if ( p.id().equals(pageId) ){ if ( page != null ){ fail("page " + pageId + " returned twice"); } page = p; } } assertNotNull(page); assertEquals(pageId, page.id()); assertEquals((Integer) 255, page.perms()); assertDatesNear(2013, 7, 1, 17, 0, 0, page.lastModified()); assertEquals((Integer) 197, page.size()); } @org.junit.Test public void readPermsWithoutBeingAnAdmin() throws Exception { try { //Test to make sure we deal correctly with the fact that Dokuwiki may //either return an Integer or a String for the perms _clientWriter.getAllPages(); _clientWriter.getRecentChanges(1356218401); } catch (ClassCastException e){ fail(); } } @org.junit.Test public void search() throws Exception { List<SearchResult> results = _client.search("amet"); SearchResult sr = results.get(0); assertEquals("nssearch:page3", sr.id()); if ( _client.getXMLRPCAPIVersion() >= 7 ){ //Previous version of the API doesn't return a title for this query assertEquals("Page 3 title", sr.title()); } else { assertEquals("nssearch:page3", sr.title()); } assertEquals((Integer) 1375376400, sr.rev()); assertEquals((Integer) 1375376400, sr.mtime()); assertEquals((Integer) 2, sr.score()); assertEquals((Integer) 197, sr.size()); assertTrue(sr.snippet().contains("Amet")); assertEquals("nssearch:start", results.get(1).id()); assertEquals((Integer) 1, results.get(1).score()); } @org.junit.Test public void logoff() throws Exception { _client.search("amet"); boolean actuallyLogoff = false; _client.logoff(); try { _client.search("amet"); } catch(DokuUnauthorizedException e){ actuallyLogoff = true; } assertTrue(actuallyLogoff); } @org.junit.Test public void putCDataEndingTag() throws Exception { String data = "<code> <![CDATA[ ]]> </code>"; _client.putPage("dummy", data); assertEquals(data, _client.getPage("dummy")); } }