From b9940551e8a9e4e6da601dcd426c8aec79c5fff1 Mon Sep 17 00:00:00 2001 From: Andreas Gohr <gohr@cosmocode.de> Date: Thu, 1 Dec 2016 11:36:17 +0100 Subject: [PATCH] refactored the remote API tests Now each command is checked within it's own test on a completely clean install. Hopefuly this also takes care of the flaky test behavior seen at Travis occasionally. --- _test/tests/inc/remoteapicore.test.php | 432 +++++++++++++++++-------- 1 file changed, 292 insertions(+), 140 deletions(-) diff --git a/_test/tests/inc/remoteapicore.test.php b/_test/tests/inc/remoteapicore.test.php index 1d0de40cf..18135bb31 100644 --- a/_test/tests/inc/remoteapicore.test.php +++ b/_test/tests/inc/remoteapicore.test.php @@ -11,6 +11,9 @@ class remoteapicore_test extends DokuWikiTest { protected $remote; public function setUp() { + // we need a clean setup before each single test: + DokuWikiTest::setUpBeforeClass(); + parent::setUp(); global $conf; global $USERINFO; @@ -28,21 +31,20 @@ class remoteapicore_test extends DokuWikiTest { } public function tearDown() { + parent::tearDown(); + global $USERINFO; global $AUTH_ACL; $USERINFO = $this->userinfo; $AUTH_ACL = $this->oldAuthAcl; - } - public function test_core() { + public function test_getVersion() { $this->assertEquals(getVersion(), $this->remote->call('dokuwiki.getVersion')); -// $params = array('user', 'passwrd'); -// $this->assertEquals(, $remoteApi->call('dokuwiki.login')); //TODO - -// $this->assertEquals(, $remoteApi->call('dokuwiki.logoff')); //TODO + } + public function test_getPageList() { $file1 = wikiFN('wiki:dokuwiki'); $file2 = wikiFN('wiki:syntax'); $expected = array( @@ -70,15 +72,20 @@ class remoteapicore_test extends DokuWikiTest { ) ); $this->assertEquals($expected, $this->remote->call('dokuwiki.getPagelist', $params)); + } - idx_addPage('wiki:syntax'); //full text search depends on index + public function test_search() { + $id = 'wiki:syntax'; + $file = wikiFN($id); + + idx_addPage($id); //full text search depends on index $expected = array( array( - 'id' => 'wiki:syntax', + 'id' => $id, 'score' => 1, - 'rev' => filemtime($file2), - 'mtime' => filemtime($file2), - 'size' => filesize($file2), + 'rev' => filemtime($file), + 'mtime' => filemtime($file), + 'size' => filesize($file), 'snippet' => ' a footnote)) by using double parentheses. ===== <strong class="search_hit">Sectioning</strong> ===== @@ -89,11 +96,15 @@ You can use up to five different levels of', ); $params = array('Sectioning'); $this->assertEquals($expected, $this->remote->call('dokuwiki.search', $params)); + } + public function test_getTime() { $timeexpect = time(); $timeactual = $this->remote->call('dokuwiki.getTime'); $this->assertTrue(($timeexpect <= $timeactual) && ($timeactual <= $timeexpect + 1)); + } + public function test_setLocks() { $expected = array( 'locked' => array('wiki:dokuwiki', 'wiki:syntax', 'nonexisting'), 'lockfail' => array(), @@ -121,176 +132,313 @@ You can use up to five different levels of', ) ); $this->assertEquals($expected, $this->remote->call('dokuwiki.setLocks', $params)); + } + public function test_getTitle() { global $conf; $this->assertEquals($conf['title'], $this->remote->call('dokuwiki.getTitle')); + } + + public function test_putPage() { + $id = 'putpage'; - $file3 = wikiFN('nice_page'); $content = "====Title====\nText"; $params = array( - 'nice_page', + $id, $content, array( 'minor' => false, 'sum' => 'Summary of nice text' ) ); - $this->assertEquals(true, $this->remote->call('wiki.putPage', $params)); //TODO check exceptions - $this->assertEquals($content, rawWiki('nice_page')); + $this->assertTrue($this->remote->call('wiki.putPage', $params)); + $this->assertEquals($content, rawWiki($id)); + + //remove page + $params = array( + $id, + '', + array( + 'minor' => false, + ) + ); + $this->assertTrue($this->remote->call('wiki.putPage', $params)); + $this->assertFileNotExists(wikiFN($id)); + } - $rev[1] = filemtime(wikiFN('nice_page')); //stored for later - sleep(1); // wait for new revision ID + public function test_getPage() { + $id = 'getpage'; + $content = 'a test'; + saveWikiText($id, $content, 'test for getpage'); - $params = array('nice_page'); + $params = array($id); $this->assertEquals($content, $this->remote->call('wiki.getPage', $params)); + } + + public function test_appendPage() { + $id = 'appendpage'; + $content = 'a test'; + $morecontent = "\nOther text"; + saveWikiText($id, $content, 'local'); - $morecontent = "\nOther text."; - $secondcontent = $content . $morecontent; - $params_append = array( - 'nice_page', + $params = array( + $id, $morecontent, array() ); - $this->assertEquals(true, $this->remote->call('dokuwiki.appendPage', $params_append)); - $this->assertEquals($secondcontent, rawWiki('nice_page')); - - $params = array('nice_page', ''); - $this->assertEquals($secondcontent, $this->remote->call('wiki.getPageVersion', $params)); - $params = array('nice_page', $rev[1]); - $this->assertEquals($content, $this->remote->call('wiki.getPageVersion', $params)); - $params = array('nice_page', 1234); - $this->assertEquals('', $this->remote->call('wiki.getPageVersion', $params), 'Not existing revision'); - $params = array('notexisting', 1234); - $this->assertEquals('', $this->remote->call('wiki.getPageVersion', $params), 'Not existing page'); - - $html1 = "\n<h3 class=\"sectionedit1\" id=\"title\">Title</h3>\n<div class=\"level3\">\n\n<p>\nText\n"; - $html2 = "Other text.\n"; - $html3 = "</p>\n\n</div>\n"; - $params = array('nice_page'); - $this->assertEquals($html1 . $html2 . $html3, $this->remote->call('wiki.getPageHTML', $params)); - - $params = array('nice_page', ''); - $this->assertEquals($html1 . $html2 . $html3, $this->remote->call('wiki.getPageHTMLVersion', $params)); - $params = array('nice_page', $rev[1]); - $this->assertEquals($html1 . $html3, $this->remote->call('wiki.getPageHTMLVersion', $params)); - $params = array('nice_page', 1234); - $this->assertEquals('', $this->remote->call('wiki.getPageHTMLVersion', $params)); + $this->assertEquals(true, $this->remote->call('dokuwiki.appendPage', $params)); + $this->assertEquals($content . $morecontent, rawWiki($id)); + } + + public function test_getPageVersion() { + $id = 'pageversion'; + $file = wikiFN($id); + + saveWikiText($id, 'first version', 'first'); + $rev1 = filemtime($file); + clearstatcache(false, $file); + $this->waitForTick(true); + saveWikiText($id, 'second version', 'second'); + $rev2 = filemtime($file); + + $params = array($id, ''); + $this->assertEquals('second version', $this->remote->call('wiki.getPageVersion', $params), 'no revision given'); + + $params = array($id, $rev1); + $this->assertEquals('first version', $this->remote->call('wiki.getPageVersion', $params), '1st revision given'); + + $params = array($id, $rev2); + $this->assertEquals('second version', $this->remote->call('wiki.getPageVersion', $params), '2nd revision given'); + + $params = array($id, 1234); + $this->assertEquals('', $this->remote->call('wiki.getPageVersion', $params), 'Non existing revision given'); + + $params = array('foobar', 1234); + $this->assertEquals('', $this->remote->call('wiki.getPageVersion', $params), 'Non existing page given'); + } + + public function test_getPageHTML() { + $id = 'htmltest'; + $content = "====Title====\nText"; + $html = "\n<h3 class=\"sectionedit1\" id=\"title\">Title</h3>\n<div class=\"level3\">\n\n<p>\nText\n</p>\n\n</div>\n"; + + saveWikiText($id, $content, 'htmltest'); + + $params = array($id); + $this->assertEquals($html, $this->remote->call('wiki.getPageHTML', $params)); + } + + public function test_getPageHTMLVersion() { + $id = 'htmltest'; + $file = wikiFN($id); + + $content1 = "====Title====\nText"; + $html1 = "\n<h3 class=\"sectionedit1\" id=\"title\">Title</h3>\n<div class=\"level3\">\n\n<p>\nText\n</p>\n\n</div>\n"; + $content2 = "====Foobar====\nText Bamm"; + $html2 = "\n<h3 class=\"sectionedit1\" id=\"foobar\">Foobar</h3>\n<div class=\"level3\">\n\n<p>\nText Bamm\n</p>\n\n</div>\n"; + + saveWikiText($id, $content1, 'first'); + $rev1 = filemtime($file); + clearstatcache(false, $file); + $this->waitForTick(true); + saveWikiText($id, $content2, 'second'); + $rev2 = filemtime($file); + + $params = array($id, ''); + $this->assertEquals($html2, $this->remote->call('wiki.getPageHTMLVersion', $params), 'no revision given'); + + $params = array($id, $rev1); + $this->assertEquals($html1, $this->remote->call('wiki.getPageHTMLVersion', $params), '1st revision given'); + + $params = array($id, $rev2); + $this->assertEquals($html2, $this->remote->call('wiki.getPageHTMLVersion', $params), '2nd revision given'); + + $params = array($id, 1234); + $this->assertEquals('', $this->remote->call('wiki.getPageHTMLVersion', $params), 'Non existing revision given'); + + $params = array('foobar', 1234); + $this->assertEquals('', $this->remote->call('wiki.getPageHTMLVersion', $params), 'Non existing page given'); + } + + public function test_getAllPages() { + // all pages depends on index + idx_addPage('wiki:syntax'); + idx_addPage('wiki:dokuwiki'); + + $file1 = wikiFN('wiki:syntax'); + $file2 = wikiFN('wiki:dokuwiki'); $expected = array( array( 'id' => 'wiki:syntax', 'perms' => 8, - 'size' => filesize($file2), - 'lastModified' => filemtime($file2) + 'size' => filesize($file1), + 'lastModified' => filemtime($file1) ), array( - 'id' => 'nice_page', + 'id' => 'wiki:dokuwiki', 'perms' => 8, - 'size' => filesize($file3), - 'lastModified' => filemtime($file3) + 'size' => filesize($file2), + 'lastModified' => filemtime($file2) ) ); - $this->assertEquals($expected, $this->remote->call('wiki.getAllPages')); //only indexed pages + $this->assertEquals($expected, $this->remote->call('wiki.getAllPages')); + } + + public function test_getBacklinks() { + saveWikiText('linky', '[[wiki:syntax]]', 'test'); + // backlinks need index + idx_addPage('wiki:syntax'); + idx_addPage('linky'); $params = array('wiki:syntax'); - $this->assertEquals(ft_backlinks('wiki:syntax'), $this->remote->call('wiki.getBackLinks', $params)); + $result = $this->remote->call('wiki.getBackLinks', $params); + $this->assertTrue(count($result) > 0); + $this->assertEquals(ft_backlinks('wiki:syntax'), $result); + } + + public function test_getPageInfo() { + $id = 'pageinfo'; + $file = wikiFN($id); + + saveWikiText($id, 'test', 'test'); $expected = array( - 'name' => 'nice_page', - 'lastModified' => filemtime($file3), + 'name' => $id, + 'lastModified' => filemtime($file), 'author' => clientIP(), - 'version' => filemtime($file3) + 'version' => filemtime($file) ); - $params = array('nice_page'); + $params = array($id); $this->assertEquals($expected, $this->remote->call('wiki.getPageInfo', $params)); + } + + public function test_getPageInfoVersion() { + $id = 'pageinfo'; + $file = wikiFN($id); + + saveWikiText($id, 'first version', 'first'); + $rev1 = filemtime($file); + clearstatcache(false, $file); + $this->waitForTick(true); + saveWikiText($id, 'second version', 'second'); + $rev2 = filemtime($file); $expected = array( - 'name' => 'nice_page', - 'lastModified' => $rev[1], + 'name' => $id, + 'lastModified' => $rev2, 'author' => clientIP(), - 'version' => $rev[1] + 'version' => $rev2 ); - $params = array('nice_page', $rev[1]); - $this->assertEquals($expected, $this->remote->call('wiki.getPageInfoVersion', $params)); - - clearstatcache(wikiFN('nice_page')); - $rev[2] = filemtime(wikiFN('nice_page')); - sleep(1); // wait for new revision ID - clearstatcache(wikiFN('nice_page')); - $this->remote->call('dokuwiki.appendPage', $params_append); - $rev[3] = filemtime(wikiFN('nice_page')); - sleep(1); - clearstatcache(wikiFN('nice_page')); - $this->remote->call('dokuwiki.appendPage', $params_append); - $rev[4] = filemtime(wikiFN('nice_page')); - sleep(1); - clearstatcache(wikiFN('nice_page')); - $this->remote->call('dokuwiki.appendPage', $params_append); - $rev[5] = filemtime(wikiFN('nice_page')); - sleep(1); - clearstatcache(wikiFN('nice_page')); - $this->remote->call('dokuwiki.appendPage', $params_append); - $rev[6] = filemtime(wikiFN('nice_page')); - sleep(1); + $params = array($id, ''); + $this->assertEquals($expected, $this->remote->call('wiki.getPageInfoVersion', $params), 'no revision given'); $expected = array( + 'name' => $id, + 'lastModified' => $rev1, + 'author' => clientIP(), + 'version' => $rev1 + ); + $params = array($id, $rev1); + $this->assertEquals($expected, $this->remote->call('wiki.getPageInfoVersion', $params), '1st revision given'); + + $expected = array( + 'name' => $id, + 'lastModified' => $rev2, + 'author' => clientIP(), + 'version' => $rev2 + ); + $params = array($id, $rev2); + $this->assertEquals($expected, $this->remote->call('wiki.getPageInfoVersion', $params), '2nd revision given'); + } + + public function test_getRecentChanges() { + + saveWikiText('pageone', 'test', 'test'); + $rev1 = filemtime(wikiFN('pageone')); + saveWikiText('pagetwo', 'test', 'test'); + $rev2 = filemtime(wikiFN('pagetwo')); + + $expected = array( + array( + 'name' => 'pageone', + 'lastModified' => $rev1, + 'author' => '', + 'version' => $rev1, + 'perms' => 8, + 'size' => 4 + ), array( - 'name' => 'nice_page', - 'lastModified' => $rev[6], + 'name' => 'pagetwo', + 'lastModified' => $rev2, 'author' => '', - 'version' => $rev[6], + 'version' => $rev2, 'perms' => 8, - 'size' => 78 + 'size' => 4 ) ); $params = array(strtotime("-1 year")); $this->assertEquals($expected, $this->remote->call('wiki.getRecentChanges', $params)); + } - $params = array('nice_page', 0); - $versions = $this->remote->call('wiki.getPageVersions', $params); - $this->assertEquals($rev[6], $versions[0]['version']); - $this->assertEquals($rev[5], $versions[1]['version']); - $this->assertEquals($rev[1], $versions[5]['version']); - $this->assertEquals(6, count($this->remote->call('wiki.getPageVersions', $params))); + public function test_getPageVersions() { + global $conf; + + $id = 'revpage'; + $file = wikiFN($id); - $params = array('nice_page', 1); + $rev = array(); + for($i = 0; $i < 6; $i++) { + $this->waitForTick(); + saveWikiText($id, "rev$i", "rev$i"); + clearstatcache(false, $file); + $rev[$i] = filemtime($file); + } + + $params = array($id, 0); $versions = $this->remote->call('wiki.getPageVersions', $params); + $this->assertEquals(6, count($versions)); $this->assertEquals($rev[5], $versions[0]['version']); $this->assertEquals($rev[4], $versions[1]['version']); - $this->assertEquals(5, count($this->remote->call('wiki.getPageVersions', $params))); - - $conf['recent'] = 3; //set number of page returned - $params = array('nice_page', 1); - $this->assertEquals(3, count($this->remote->call('wiki.getPageVersions', $params))); + $this->assertEquals($rev[3], $versions[2]['version']); + $this->assertEquals($rev[2], $versions[3]['version']); + $this->assertEquals($rev[1], $versions[4]['version']); + $this->assertEquals($rev[0], $versions[5]['version']); - $params = array('nice_page', $conf['recent']); + $params = array($id, 1); // offset 1 $versions = $this->remote->call('wiki.getPageVersions', $params); - $this->assertEquals($rev[3], $versions[0]['version']); //skips current,1st old,2nd old - $this->assertEquals(3, count($this->remote->call('wiki.getPageVersions', $params))); + $this->assertEquals(5, count($versions)); + $this->assertEquals($rev[4], $versions[0]['version']); + $this->assertEquals($rev[3], $versions[1]['version']); + $this->assertEquals($rev[2], $versions[2]['version']); + $this->assertEquals($rev[1], $versions[3]['version']); + $this->assertEquals($rev[0], $versions[4]['version']); - $params = array('nice_page', 2 * $conf['recent']); - $this->assertEquals(0, count($this->remote->call('wiki.getPageVersions', $params))); + $conf['recent'] = 3; //set number of results per page - //remove page - $file3 = wikiFN('nice_page'); - $content = ""; - $params = array( - 'nice_page', - $content, - array( - 'minor' => false, - ) - ); - $this->assertEquals(true, $this->remote->call('wiki.putPage', $params)); - $this->assertFalse(file_exists($file3)); + $params = array($id, 0); // first page + $versions = $this->remote->call('wiki.getPageVersions', $params); + $this->assertEquals(3, count($versions)); + $this->assertEquals($rev[5], $versions[0]['version']); + $this->assertEquals($rev[4], $versions[1]['version']); + $this->assertEquals($rev[3], $versions[2]['version']); - $params = array('nice_page', 0); - $this->assertEquals(2, count($this->remote->call('wiki.getPageVersions', $params))); + $params = array($id, $conf['recent']); // second page + $versions = $this->remote->call('wiki.getPageVersions', $params); + $this->assertEquals(3, count($versions)); + $this->assertEquals($rev[2], $versions[0]['version']); + $this->assertEquals($rev[1], $versions[1]['version']); + $this->assertEquals($rev[0], $versions[2]['version']); - $params = array('nice_page', 1); - $this->assertEquals(3, count($this->remote->call('wiki.getPageVersions', $params))); + $params = array($id, $conf['recent'] * 2); // third page + $versions = $this->remote->call('wiki.getPageVersions', $params); + $this->assertEquals(0, count($versions)); + } + + public function test_aclCheck() { + $id = 'aclpage'; - $params = array('nice_page'); + $params = array($id); $this->assertEquals(AUTH_UPLOAD, $this->remote->call('wiki.aclCheck', $params)); global $conf; @@ -303,39 +451,43 @@ You can use up to five different levels of', '* @user 2', //edit ); - $params = array('nice_page'); + $params = array($id); $this->assertEquals(AUTH_EDIT, $this->remote->call('wiki.aclCheck', $params)); + } + public function test_getXMLRPCAPIVersion() { $this->assertEquals(DOKU_API_VERSION, $this->remote->call('dokuwiki.getXMLRPCAPIVersion')); + } + public function test_getRPCVersionSupported() { $this->assertEquals(2, $this->remote->call('wiki.getRPCVersionSupported')); } - public function test_core2() { + public function test_listLinks() { $localdoku = array( 'type' => 'local', 'page' => 'DokuWiki', 'href' => DOKU_BASE . DOKU_SCRIPT . '?id=DokuWiki' ); $expected = array( //no local links - $localdoku, - array( - 'type' => 'extern', - 'page' => 'http://www.freelists.org', - 'href' => 'http://www.freelists.org' - ), - array( - 'type' => 'extern', - 'page' => 'https://tools.ietf.org/html/rfc1855', - 'href' => 'https://tools.ietf.org/html/rfc1855' - ), - array( - 'type' => 'extern', - 'page' => 'http://www.catb.org/~esr/faqs/smart-questions.html', - 'href' => 'http://www.catb.org/~esr/faqs/smart-questions.html' - ), - $localdoku, - $localdoku + $localdoku, + array( + 'type' => 'extern', + 'page' => 'http://www.freelists.org', + 'href' => 'http://www.freelists.org' + ), + array( + 'type' => 'extern', + 'page' => 'https://tools.ietf.org/html/rfc1855', + 'href' => 'https://tools.ietf.org/html/rfc1855' + ), + array( + 'type' => 'extern', + 'page' => 'http://www.catb.org/~esr/faqs/smart-questions.html', + 'href' => 'http://www.catb.org/~esr/faqs/smart-questions.html' + ), + $localdoku, + $localdoku ); $params = array('mailinglist'); $this->assertEquals($expected, $this->remote->call('wiki.listLinks', $params)); -- GitLab